Blame view

App/camera/ConfirmViewController/MyConfirmViewController.swift 4.46 KB
1341bf603   Trịnh Văn Quân   version 1.1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
  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() {
          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()
  
          //TODO
  //        if let boardObj = userData as? BoardObj {
  //
  //        }
      }
  
      public override func viewWillLayoutSubviews() {
          super.viewWillLayoutSubviews()
          imageView.frame = view.frame
  //        vBoard?.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 {
  
  }