Skip to content

Commit e1943d7

Browse files
authored
Merge pull request #125 from qalandarov/separate-delegates
Separate delegates into extensions
2 parents 7da6b1e + 5a49d03 commit e1943d7

File tree

1 file changed

+106
-87
lines changed

1 file changed

+106
-87
lines changed

Sources/CodeScanner/ScannerViewController.swift

+106-87
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import UIKit
1212
@available(macCatalyst 14.0, *)
1313
extension CodeScannerView {
1414

15-
public class ScannerViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, AVCaptureMetadataOutputObjectsDelegate, UIAdaptivePresentationControllerDelegate {
15+
public class ScannerViewController: UIViewController, UINavigationControllerDelegate {
1616
private let photoOutput = AVCapturePhotoOutput()
1717
private var isCapturing = false
1818
private var handler: ((UIImage) -> Void)?
@@ -56,50 +56,6 @@ extension CodeScannerView {
5656
openGallery()
5757
}
5858

59-
public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
60-
isGalleryShowing = false
61-
62-
if let qrcodeImg = info[.originalImage] as? UIImage {
63-
let detector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options: [CIDetectorAccuracy: CIDetectorAccuracyHigh])!
64-
let ciImage = CIImage(image:qrcodeImg)!
65-
var qrCodeLink = ""
66-
67-
let features = detector.features(in: ciImage)
68-
69-
for feature in features as! [CIQRCodeFeature] {
70-
qrCodeLink = feature.messageString!
71-
if qrCodeLink == "" {
72-
didFail(reason: .badOutput)
73-
} else {
74-
let corners = [
75-
feature.bottomLeft,
76-
feature.bottomRight,
77-
feature.topRight,
78-
feature.topLeft
79-
]
80-
let result = ScanResult(string: qrCodeLink, type: .qr, image: qrcodeImg, corners: corners)
81-
found(result)
82-
}
83-
84-
}
85-
86-
} else {
87-
print("Something went wrong")
88-
}
89-
90-
dismiss(animated: true, completion: nil)
91-
}
92-
93-
public func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
94-
isGalleryShowing = false
95-
dismiss(animated: true, completion: nil)
96-
}
97-
98-
public func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
99-
// Gallery is no longer being presented
100-
isGalleryShowing = false
101-
}
102-
10359
#if targetEnvironment(simulator)
10460
override public func loadView() {
10561
view = UIView()
@@ -449,48 +405,6 @@ extension CodeScannerView {
449405
lastTime = Date()
450406
}
451407

452-
public func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
453-
if let metadataObject = metadataObjects.first {
454-
guard let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject else { return }
455-
guard let stringValue = readableObject.stringValue else { return }
456-
457-
guard didFinishScanning == false else { return }
458-
459-
let photoSettings = AVCapturePhotoSettings()
460-
guard !isCapturing else { return }
461-
isCapturing = true
462-
463-
handler = { [self] image in
464-
let result = ScanResult(string: stringValue, type: readableObject.type, image: image, corners: readableObject.corners)
465-
466-
switch parentView.scanMode {
467-
case .once:
468-
found(result)
469-
// make sure we only trigger scan once per use
470-
didFinishScanning = true
471-
472-
case .manual:
473-
if !didFinishScanning, isWithinManualCaptureInterval() {
474-
found(result)
475-
didFinishScanning = true
476-
}
477-
478-
case .oncePerCode:
479-
if !codesFound.contains(stringValue) {
480-
codesFound.insert(stringValue)
481-
found(result)
482-
}
483-
484-
case .continuous:
485-
if isPastScanInterval() {
486-
found(result)
487-
}
488-
}
489-
}
490-
photoOutput.capturePhoto(with: photoSettings, delegate: self)
491-
}
492-
}
493-
494408
func isPastScanInterval() -> Bool {
495409
Date().timeIntervalSince(lastTime) >= parentView.scanInterval
496410
}
@@ -516,6 +430,109 @@ extension CodeScannerView {
516430
}
517431
}
518432

433+
// MARK: - AVCaptureMetadataOutputObjectsDelegate
434+
435+
@available(macCatalyst 14.0, *)
436+
extension CodeScannerView.ScannerViewController: AVCaptureMetadataOutputObjectsDelegate {
437+
public func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
438+
if let metadataObject = metadataObjects.first {
439+
guard let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject else { return }
440+
guard let stringValue = readableObject.stringValue else { return }
441+
442+
guard didFinishScanning == false else { return }
443+
444+
let photoSettings = AVCapturePhotoSettings()
445+
guard !isCapturing else { return }
446+
isCapturing = true
447+
448+
handler = { [self] image in
449+
let result = ScanResult(string: stringValue, type: readableObject.type, image: image, corners: readableObject.corners)
450+
451+
switch parentView.scanMode {
452+
case .once:
453+
found(result)
454+
// make sure we only trigger scan once per use
455+
didFinishScanning = true
456+
457+
case .manual:
458+
if !didFinishScanning, isWithinManualCaptureInterval() {
459+
found(result)
460+
didFinishScanning = true
461+
}
462+
463+
case .oncePerCode:
464+
if !codesFound.contains(stringValue) {
465+
codesFound.insert(stringValue)
466+
found(result)
467+
}
468+
469+
case .continuous:
470+
if isPastScanInterval() {
471+
found(result)
472+
}
473+
}
474+
}
475+
photoOutput.capturePhoto(with: photoSettings, delegate: self)
476+
}
477+
}
478+
}
479+
480+
// MARK: - UIImagePickerControllerDelegate
481+
482+
@available(macCatalyst 14.0, *)
483+
extension CodeScannerView.ScannerViewController: UIImagePickerControllerDelegate {
484+
public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
485+
isGalleryShowing = false
486+
487+
if let qrcodeImg = info[.originalImage] as? UIImage {
488+
let detector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options: [CIDetectorAccuracy: CIDetectorAccuracyHigh])!
489+
let ciImage = CIImage(image:qrcodeImg)!
490+
var qrCodeLink = ""
491+
492+
let features = detector.features(in: ciImage)
493+
494+
for feature in features as! [CIQRCodeFeature] {
495+
qrCodeLink = feature.messageString!
496+
if qrCodeLink == "" {
497+
didFail(reason: .badOutput)
498+
} else {
499+
let corners = [
500+
feature.bottomLeft,
501+
feature.bottomRight,
502+
feature.topRight,
503+
feature.topLeft
504+
]
505+
let result = ScanResult(string: qrCodeLink, type: .qr, image: qrcodeImg, corners: corners)
506+
found(result)
507+
}
508+
509+
}
510+
511+
} else {
512+
print("Something went wrong")
513+
}
514+
515+
dismiss(animated: true, completion: nil)
516+
}
517+
518+
public func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
519+
isGalleryShowing = false
520+
dismiss(animated: true, completion: nil)
521+
}
522+
}
523+
524+
// MARK: - UIAdaptivePresentationControllerDelegate
525+
526+
@available(macCatalyst 14.0, *)
527+
extension CodeScannerView.ScannerViewController: UIAdaptivePresentationControllerDelegate {
528+
public func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
529+
// Gallery is no longer being presented
530+
isGalleryShowing = false
531+
}
532+
}
533+
534+
// MARK: - AVCapturePhotoCaptureDelegate
535+
519536
@available(macCatalyst 14.0, *)
520537
extension CodeScannerView.ScannerViewController: AVCapturePhotoCaptureDelegate {
521538

@@ -552,6 +569,8 @@ extension CodeScannerView.ScannerViewController: AVCapturePhotoCaptureDelegate {
552569

553570
}
554571

572+
// MARK: - AVCaptureDevice
573+
555574
@available(macCatalyst 14.0, *)
556575
public extension AVCaptureDevice {
557576

0 commit comments

Comments
 (0)