@@ -25,14 +25,12 @@ import AVFoundation
2525/**
2626 SPQRCameraViewController: Main view. Can be customisable if need.
2727
28- For change duration, check method `present` and pass duration and other specific property if need customise .
28+ Use `delegate` or `cameraFoundHandler` callback to get recognition results .
2929
30- Here available set window on which shoud be present.
31- If you have some windows, you shoud configure it. Check property `presentWindow`.
30+ Example:
3231
33- For disable dismiss by tap, check property `.dismissByTap`.
34-
35- Recomended call `SPAlert` and choose style func.
32+ let viewController = SPQRCameraViewController()
33+ otherViewController.present(viewController)
3634 */
3735open class SPQRCameraViewController : UIViewController {
3836
@@ -57,8 +55,8 @@ open class SPQRCameraViewController: UIViewController {
5755 public var cameraFoundHandler : SPQRCameraFoundHandler ?
5856 public var cameraDidPressHandler : SPQRCameraHandlerDidPressHandler ?
5957
60- private lazy var frameView : UIView = SPFrameView ( )
61- private lazy var previewView : UIView = SPPreviewLabel ( )
58+ public var customFrameView : UIView ?
59+ public var customPreviewView : UIView ?
6260
6361 // MARK: - Private Properties
6462
@@ -67,6 +65,15 @@ open class SPQRCameraViewController: UIViewController {
6765 // MARK: - Sublayers
6866
6967 private lazy var videoPreviewLayer : AVCaptureVideoPreviewLayer = createVideoPreviewLayer ( )
68+ private lazy var defaultFrameView = SPFrameView ( )
69+ private lazy var defaultPreviewView = SPPreviewLabel ( )
70+
71+ private var frameView : UIView {
72+ customFrameView ?? defaultFrameView
73+ }
74+ private var previewView : UIView {
75+ customPreviewView ?? defaultPreviewView
76+ }
7077
7178 // MARK: - Private Properties
7279
@@ -82,7 +89,7 @@ open class SPQRCameraViewController: UIViewController {
8289 super. init ( coder: coder)
8390 }
8491
85- public override func viewDidLoad( ) {
92+ open override func viewDidLoad( ) {
8693 super. viewDidLoad ( )
8794 configureView ( )
8895 configureActions ( )
@@ -91,20 +98,24 @@ open class SPQRCameraViewController: UIViewController {
9198 captureSession. startRunning ( )
9299 }
93100
94- public override func viewWillLayoutSubviews( ) {
101+ open override func viewWillLayoutSubviews( ) {
95102 super. viewWillLayoutSubviews ( )
96103 videoPreviewLayer. frame = view. layer. bounds
97104 }
98105
99106 open func updatePreviewView( for object: AVMetadataMachineReadableCodeObject ) {
100- if let previewView = previewView as? SPPreviewLabel {
101- previewView. text = object. stringValue
107+ if let string = object. stringValue {
108+ if let url = URL ( string: string) {
109+ defaultPreviewView. text = " URL: \" \( url. absoluteString) \" "
110+ } else {
111+ defaultPreviewView. text = " Text: \" \( string) \" "
112+ }
102113 }
103114 }
104115
105116 // MARK: - Actions
106117
107- @objc private func previewDidPress( ) {
118+ @objc func previewDidPress( _ sender : UITapGestureRecognizer ) {
108119 notifyDidPress ( )
109120 }
110121
@@ -121,7 +132,6 @@ private extension SPQRCameraViewController {
121132 }
122133
123134 private func configureSubviews( ) {
124- frameView. backgroundColor = . clear
125135 frameView. isHidden = true
126136 previewView. isHidden = true
127137 }
@@ -165,11 +175,17 @@ private extension SPQRCameraViewController {
165175 }
166176
167177 private func configureActions( ) {
168- previewView. isUserInteractionEnabled = true
169- frameView. isUserInteractionEnabled = true
178+ let previewViewTapGesture = UITapGestureRecognizer (
179+ target: self ,
180+ action: #selector( previewDidPress)
181+ )
182+ let frameViewTapGesture = UITapGestureRecognizer (
183+ target: self ,
184+ action: #selector( previewDidPress)
185+ )
170186
171- previewView. addGestureRecognizer ( UITapGestureRecognizer ( target : self , action : #selector ( previewDidPress ) ) )
172- frameView. addGestureRecognizer ( UITapGestureRecognizer ( target : self , action : #selector ( previewDidPress ) ) )
187+ previewView. addGestureRecognizer ( previewViewTapGesture )
188+ frameView. addGestureRecognizer ( frameViewTapGesture )
173189 }
174190
175191}
@@ -179,8 +195,8 @@ private extension SPQRCameraViewController {
179195extension SPQRCameraViewController : AVCaptureMetadataOutputObjectsDelegate {
180196
181197 open func metadataOutput( _ output: AVCaptureMetadataOutput ,
182- didOutput metadataObjects: [ AVMetadataObject ] ,
183- from connection: AVCaptureConnection ) {
198+ didOutput metadataObjects: [ AVMetadataObject ] ,
199+ from connection: AVCaptureConnection ) {
184200 guard !metadataObjects. isEmpty else {
185201 return
186202 }
@@ -207,10 +223,10 @@ extension SPQRCameraViewController: AVCaptureMetadataOutputObjectsDelegate {
207223 if frameView. isHidden {
208224 frameView. frame = frame
209225 } else {
210- UIView . animate ( withDuration: 0.3 ) {
226+ UIView . animate ( withDuration: 0.3 , delay : 0.0 , options : . allowUserInteraction , animations : {
211227 self . frameView. frame = frame
212228 self . view. layoutIfNeeded ( )
213- }
229+ } , completion : nil )
214230 }
215231
216232 previewView. isHidden = false
@@ -253,7 +269,7 @@ private extension SPQRCameraViewController {
253269
254270 private func createVideoPreviewLayer( ) -> AVCaptureVideoPreviewLayer {
255271 let videoPreviewLayer = AVCaptureVideoPreviewLayer ( session: captureSession)
256- videoPreviewLayer. videoGravity = AVLayerVideoGravity . resizeAspectFill
272+ videoPreviewLayer. videoGravity = . resizeAspectFill
257273 return videoPreviewLayer
258274 }
259275
0 commit comments