From 1ad1fccd37baeb061ba2fc515ccf381092ece054 Mon Sep 17 00:00:00 2001 From: Chris McGehee Date: Mon, 26 Sep 2022 05:51:39 -0700 Subject: [PATCH] Added ability to pause scanning --- Sources/CodeScanner/CodeScanner.swift | 6 +++++- Sources/CodeScanner/ScannerViewController.swift | 12 ++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Sources/CodeScanner/CodeScanner.swift b/Sources/CodeScanner/CodeScanner.swift index ca52dfc..8b71a67 100644 --- a/Sources/CodeScanner/CodeScanner.swift +++ b/Sources/CodeScanner/CodeScanner.swift @@ -66,6 +66,7 @@ public struct CodeScannerView: UIViewControllerRepresentable { public var simulatedData = "" public var shouldVibrateOnSuccess: Bool public var isTorchOn: Bool + public var isScannerPaused: Bool public var isGalleryPresented: Binding public var videoCaptureDevice: AVCaptureDevice? public var completion: (Result) -> Void @@ -79,6 +80,7 @@ public struct CodeScannerView: UIViewControllerRepresentable { simulatedData: String = "", shouldVibrateOnSuccess: Bool = true, isTorchOn: Bool = false, + isScannerPaused: Bool = false, isGalleryPresented: Binding = .constant(false), videoCaptureDevice: AVCaptureDevice? = AVCaptureDevice.default(for: .video), completion: @escaping (Result) -> Void @@ -91,19 +93,21 @@ public struct CodeScannerView: UIViewControllerRepresentable { self.simulatedData = simulatedData self.shouldVibrateOnSuccess = shouldVibrateOnSuccess self.isTorchOn = isTorchOn + self.isScannerPaused = isScannerPaused self.isGalleryPresented = isGalleryPresented self.videoCaptureDevice = videoCaptureDevice self.completion = completion } public func makeUIViewController(context: Context) -> ScannerViewController { - return ScannerViewController(showViewfinder: showViewfinder, parentView: self) + return ScannerViewController(showViewfinder: showViewfinder, isScannerPaused: isScannerPaused, parentView: self) } public func updateUIViewController(_ uiViewController: ScannerViewController, context: Context) { uiViewController.parentView = self uiViewController.updateViewController( isTorchOn: isTorchOn, + isScannerPaused: isScannerPaused, isGalleryPresented: isGalleryPresented.wrappedValue, isManualCapture: scanMode == .manual, isManualSelect: manualSelect diff --git a/Sources/CodeScanner/ScannerViewController.swift b/Sources/CodeScanner/ScannerViewController.swift index c34ba56..5f231db 100644 --- a/Sources/CodeScanner/ScannerViewController.swift +++ b/Sources/CodeScanner/ScannerViewController.swift @@ -19,6 +19,7 @@ extension CodeScannerView { var didFinishScanning = false var lastTime = Date(timeIntervalSince1970: 0) private let showViewfinder: Bool + private var isScannerPaused: Bool private var isGalleryShowing: Bool = false { didSet { @@ -29,14 +30,18 @@ extension CodeScannerView { } } - public init(showViewfinder: Bool = false, parentView: CodeScannerView) { + public init(showViewfinder: Bool = false, isScannerPaused: Bool, parentView: CodeScannerView) { self.parentView = parentView self.showViewfinder = showViewfinder + self.isScannerPaused = isScannerPaused + super.init(nibName: nil, bundle: nil) } required init?(coder: NSCoder) { self.showViewfinder = false + self.isScannerPaused = false + super.init(coder: coder) } @@ -390,7 +395,7 @@ extension CodeScannerView { } #endif - func updateViewController(isTorchOn: Bool, isGalleryPresented: Bool, isManualCapture: Bool, isManualSelect: Bool) { + func updateViewController(isTorchOn: Bool, isScannerPaused: Bool, isGalleryPresented: Bool, isManualCapture: Bool, isManualSelect: Bool) { if let backCamera = AVCaptureDevice.default(for: AVMediaType.video), backCamera.hasTorch { @@ -403,6 +408,8 @@ extension CodeScannerView { openGallery() } + self.isScannerPaused = isScannerPaused + #if !targetEnvironment(simulator) showManualCaptureButton(isManualCapture) showManualSelectButton(isManualSelect) @@ -426,6 +433,7 @@ extension CodeScannerView { guard let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject else { return } guard let stringValue = readableObject.stringValue else { return } guard didFinishScanning == false else { return } + guard isScannerPaused == false else { return } let result = ScanResult(string: stringValue, type: readableObject.type) switch parentView.scanMode {