import UIKit import Photos public class MyConfirmViewController: UIViewController { let imageView = UIImageView() var vBoard: Board! @IBOutlet weak var cancelButton: UIButton! @IBOutlet weak var confirmButton: UIButton! public var userData: Any? public var onComplete: CameraViewCompletion? var asset: PHAsset! public init(asset: PHAsset) { self.asset = asset super.init(nibName: "MyConfirmViewController", bundle: CameraGlobals.shared.bundle) } public override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = UIColor.black imageView.contentMode = .scaleAspectFit view.insertSubview(imageView, at: 0) configUserData() guard let asset = asset else { return } let spinner = showSpinner() disable() _ = SingleImageFetcher() .setAsset(asset) .setTargetSize(largestPhotoSize()) .onSuccess { image in self.configureWithImage(image) self.hideSpinner(spinner) self.enable() } .onFailure { error in self.hideSpinner(spinner) } .fetch() } fileprivate func configUserData() { if let boardObj = userData as? BoardObj, let shootItem = boardObj.shootItem, let ctruong = boardObj.cTruong, let singboard = ctruong.signboard { if (singboard > 0) { vBoard = Board() vBoard.translatesAutoresizingMaskIntoConstraints = false self.view.insertSubview(vBoard, at: 1) NSLayoutConstraint.activate([vBoard.topAnchor.constraint(equalTo: view.topAnchor), vBoard.leftAnchor.constraint(equalTo: view.leftAnchor), vBoard.rightAnchor.constraint(equalTo: view.rightAnchor), vBoard.bottomAnchor.constraint(equalTo: view.bottomAnchor)]) vBoard.initData(ctruong: ctruong, shootItem: shootItem); } } } public override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() imageView.frame = view.frame } //region utils ======== private func configureWithImage(_ image: UIImage) { buttonActions() imageView.image = image imageView.sizeToFit() view.setNeedsLayout() } private func buttonActions() { confirmButton.action = { [weak self] in self?.confirmPhoto() } cancelButton.action = { [weak self] in self?.cancel() } } internal func cancel() { onComplete?(nil, nil) } internal func confirmPhoto() { disable() imageView.isHidden = true let spinner = showSpinner() var fetcher = SingleImageFetcher() .onSuccess { image in self.onComplete?(image, self.asset) self.hideSpinner(spinner) self.enable() } .onFailure { error in self.hideSpinner(spinner) self.showNoImageScreen(error) } .setAsset(asset) fetcher = fetcher.fetch() } func showSpinner() -> UIActivityIndicatorView { let spinner = UIActivityIndicatorView() spinner.activityIndicatorViewStyle = .white spinner.center = view.center spinner.startAnimating() view.addSubview(spinner) view.bringSubview(toFront: spinner) return spinner } func hideSpinner(_ spinner: UIActivityIndicatorView) { spinner.stopAnimating() spinner.removeFromSuperview() } func disable() { confirmButton.isEnabled = false } func enable() { confirmButton.isEnabled = true } func showNoImageScreen(_ error: NSError) { let permissionsView = PermissionsView(frame: view.bounds) let desc = localizedString("error.cant-fetch-photo.description") permissionsView.configureInView(view, title: error.localizedDescription, descriptiom: desc, completion: cancel) } public required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } public override var prefersStatusBarHidden: Bool { return true } public override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { return UIStatusBarAnimation.slide } override open var supportedInterfaceOrientations: UIInterfaceOrientationMask { return UIInterfaceOrientationMask.landscape } //endregion } public class BoardObj { var cTruong: CongTruong?; var shootItem: ShootItem?; init(cTruong: CongTruong?, shootItem: ShootItem?) { self.cTruong = cTruong; self.shootItem = shootItem; } }