@@ -5,7 +5,7 @@ import AVFoundation
55
66/// Delegate to handle the captured code.
77public protocol BarcodeScannerCodeDelegate : class {
8- func barcodeScanner( _ controller: BarcodeScannerController , didCapturedCode code: String , type: String )
8+ func barcodeScanner( _ controller: BarcodeScannerController , didCaptureCode code: String , type: String )
99}
1010
1111/// Delegate to report errors.
@@ -81,12 +81,7 @@ open class BarcodeScannerController: UIViewController {
8181 } ( )
8282
8383 /// Video preview layer.
84- lazy var videoPreviewLayer : AVCaptureVideoPreviewLayer = { [ unowned self] in
85- let videoPreviewLayer = AVCaptureVideoPreviewLayer ( session: self . captureSession)
86- videoPreviewLayer? . videoGravity = AVLayerVideoGravityResize
87-
88- return videoPreviewLayer!
89- } ( )
84+ var videoPreviewLayer : AVCaptureVideoPreviewLayer ?
9085
9186 /// The current controller's status mode.
9287 var status : Status = Status ( state: . scanning) {
@@ -100,9 +95,8 @@ open class BarcodeScannerController: UIViewController {
10095 guard status. state != . notFound else {
10196 infoView. status = status
10297
103- DispatchQueue . main. asyncAfter (
104- deadline: DispatchTime . now ( ) + Double( Int64 ( 2.0 * Double( NSEC_PER_SEC) ) ) / Double( NSEC_PER_SEC) ) {
105- self . status = Status ( state: . scanning)
98+ DispatchQueue . main. asyncAfter ( deadline: DispatchTime . now ( ) + 2.0 ) {
99+ self . status = Status ( state: . scanning)
106100 }
107101
108102 return
@@ -156,16 +150,16 @@ open class BarcodeScannerController: UIViewController {
156150
157151 /// When the flag is set to `true` controller returns a captured code
158152 /// and waits for the next reset action.
159- open var oneTimeSearch = true
153+ public var isOneTimeSearch = true
160154
161155 /// Delegate to handle the captured code.
162- open weak var codeDelegate : BarcodeScannerCodeDelegate ?
156+ public weak var codeDelegate : BarcodeScannerCodeDelegate ?
163157
164158 /// Delegate to report errors.
165- open weak var errorDelegate : BarcodeScannerErrorDelegate ?
159+ public weak var errorDelegate : BarcodeScannerErrorDelegate ?
166160
167161 /// Delegate to dismiss barcode scanner when the close button has been pressed.
168- open weak var dismissalDelegate : BarcodeScannerDismissalDelegate ?
162+ public weak var dismissalDelegate : BarcodeScannerDismissalDelegate ?
169163
170164 /// Flag to lock session from capturing.
171165 var locked = false
@@ -181,7 +175,15 @@ open class BarcodeScannerController: UIViewController {
181175 open override func viewDidLoad( ) {
182176 super. viewDidLoad ( )
183177
178+ videoPreviewLayer = AVCaptureVideoPreviewLayer ( session: self . captureSession)
179+ videoPreviewLayer? . videoGravity = AVLayerVideoGravityResize
180+
184181 view. backgroundColor = UIColor . black
182+
183+ guard let videoPreviewLayer = videoPreviewLayer else {
184+ return
185+ }
186+
185187 view. layer. addSublayer ( videoPreviewLayer)
186188
187189 [ infoView, headerView, settingsButton, flashButton, focusView] . forEach {
@@ -195,8 +197,10 @@ open class BarcodeScannerController: UIViewController {
195197
196198 setupCamera ( )
197199
198- NotificationCenter . default. addObserver ( self , selector: #selector( appWillEnterForeground) ,
199- name: NSNotification . Name. UIApplicationWillEnterForeground, object: nil )
200+ NotificationCenter . default. addObserver (
201+ self , selector: #selector( appWillEnterForeground) ,
202+ name: NSNotification . Name. UIApplicationWillEnterForeground,
203+ object: nil )
200204 }
201205
202206 open override func viewWillAppear( _ animated: Bool ) {
@@ -262,7 +266,7 @@ open class BarcodeScannerController: UIViewController {
262266 captureSession. addOutput ( output)
263267 output. setMetadataObjectsDelegate ( self , queue: DispatchQueue . main)
264268 output. metadataObjectTypes = metadata
265- videoPreviewLayer. session = captureSession
269+ videoPreviewLayer? . session = captureSession
266270
267271 setupFrames ( )
268272 }
@@ -272,18 +276,18 @@ open class BarcodeScannerController: UIViewController {
272276 /**
273277 Shows error message and goes back to the scanning mode.
274278
275- - Parameter message : Error message that overrides the message from the config.
279+ - Parameter errorMessage : Error message that overrides the message from the config.
276280 */
277- open func resetWithError ( _ message : String ? = nil ) {
278- status = Status ( state: . notFound, text: message )
281+ public func reset ( errorMessage : String ? = nil ) {
282+ status = Status ( state: . notFound, text: errorMessage )
279283 }
280284
281285 /**
282286 Resets the controller to the scanning mode.
283287
284288 - Parameter animated: Flag to show scanner with or without animation.
285289 */
286- open func reset( animated: Bool = true ) {
290+ public func reset( animated: Bool = true ) {
287291 status = Status ( state: . scanning, animated: animated)
288292 }
289293
@@ -294,7 +298,7 @@ open class BarcodeScannerController: UIViewController {
294298 let alpha : CGFloat = status. state == . scanning ? 1 : 0
295299
296300 torchMode = . off
297- locked = status. state == . processing && oneTimeSearch
301+ locked = status. state == . processing && isOneTimeSearch
298302
299303 status. state == . scanning
300304 ? captureSession. startRunning ( )
@@ -314,14 +318,17 @@ open class BarcodeScannerController: UIViewController {
314318 headerView. frame = CGRect ( x: 0 , y: 0 , width: view. frame. width, height: 64 )
315319 flashButton. frame = CGRect ( x: view. frame. width - 50 , y: 73 , width: 37 , height: 37 )
316320 infoView. frame = infoFrame
317- videoPreviewLayer. frame = view. layer. bounds
318321
319- if videoPreviewLayer. connection != nil {
320- videoPreviewLayer. connection. videoOrientation = . portrait
322+ if let videoPreviewLayer = videoPreviewLayer {
323+ videoPreviewLayer. frame = view. layer. bounds
324+
325+ if videoPreviewLayer. connection != nil {
326+ videoPreviewLayer. connection. videoOrientation = . portrait
327+ }
321328 }
322329
323- centerSubview ( focusView, size : CGSize ( width: 218 , height: 150 ) )
324- centerSubview ( settingsButton, size : CGSize ( width: 150 , height: 50 ) )
330+ center ( subview : focusView, inSize : CGSize ( width: 218 , height: 150 ) )
331+ center ( subview : settingsButton, inSize : CGSize ( width: 150 , height: 50 ) )
325332 }
326333
327334 /**
@@ -330,7 +337,7 @@ open class BarcodeScannerController: UIViewController {
330337 - Parameter subview: The subview.
331338 - Parameter size: A new size.
332339 */
333- func centerSubview ( _ subview: UIView , size: CGSize ) {
340+ func center ( subview: UIView , inSize size: CGSize ) {
334341 subview. frame = CGRect (
335342 x: ( view. frame. width - size. width) / 2 ,
336343 y: ( view. frame. height - size. height) / 2 ,
@@ -351,7 +358,7 @@ open class BarcodeScannerController: UIViewController {
351358
352359 - Parameter processing: Flag to set the current state to `.Processing`.
353360 */
354- func animateFlash( _ processing : Bool = false ) {
361+ func animateFlash( whenProcessing : Bool = false ) {
355362 let flashView = UIView ( frame: view. bounds)
356363 flashView. backgroundColor = UIColor . white
357364 flashView. alpha = 1
@@ -366,7 +373,7 @@ open class BarcodeScannerController: UIViewController {
366373 completion: { _ in
367374 flashView. removeFromSuperview ( )
368375
369- if processing {
376+ if whenProcessing {
370377 self . status = Status ( state: . processing)
371378 }
372379 } )
@@ -384,7 +391,7 @@ open class BarcodeScannerController: UIViewController {
384391 UIView . animate ( withDuration: 1.0 , delay: 0 ,
385392 options: [ . repeat , . autoreverse, . beginFromCurrentState] ,
386393 animations: {
387- self . centerSubview ( self . focusView, size : CGSize ( width: 280 , height: 80 ) )
394+ self . center ( subview : self . focusView, inSize : CGSize ( width: 280 , height: 80 ) )
388395 } , completion: nil )
389396 }
390397
@@ -414,30 +421,31 @@ open class BarcodeScannerController: UIViewController {
414421extension BarcodeScannerController : AVCaptureMetadataOutputObjectsDelegate {
415422
416423 public func captureOutput( _ captureOutput: AVCaptureOutput ! ,
417- didOutputMetadataObjects metadataObjects: [ Any ] ! ,
418- from connection: AVCaptureConnection ! ) {
419- guard !locked else { return }
420-
421- guard metadataObjects != nil && !metadataObjects. isEmpty else { return }
422-
423- guard let metadataObj = metadataObjects [ 0 ] as? AVMetadataMachineReadableCodeObject ,
424- let code = metadataObj. stringValue
425- , metadata. contains ( metadataObj. type) else { return }
426-
427- if oneTimeSearch {
428- locked = true
429- }
424+ didOutputMetadataObjects metadataObjects: [ Any ] ! ,
425+ from connection: AVCaptureConnection ! ) {
426+ guard !locked else { return }
427+ guard metadataObjects != nil && !metadataObjects. isEmpty else { return }
428+
429+ guard
430+ let metadataObj = metadataObjects [ 0 ] as? AVMetadataMachineReadableCodeObject ,
431+ let code = metadataObj. stringValue,
432+ metadata. contains ( metadataObj. type)
433+ else { return }
434+
435+ if isOneTimeSearch {
436+ locked = true
437+ }
430438
431- animateFlash ( oneTimeSearch )
432- codeDelegate? . barcodeScanner ( self , didCapturedCode : code, type: metadataObj. type)
439+ animateFlash ( whenProcessing : isOneTimeSearch )
440+ codeDelegate? . barcodeScanner ( self , didCaptureCode : code, type: metadataObj. type)
433441 }
434442}
435443
436444// MARK: - HeaderViewDelegate
437445
438446extension BarcodeScannerController : HeaderViewDelegate {
439447
440- func headerViewDidPressClose( _ hederView : HeaderView ) {
448+ func headerViewDidPressClose( _ headerView : HeaderView ) {
441449 dismissalDelegate? . barcodeScannerDidDismiss ( self )
442450 }
443451}
0 commit comments