Skip to content

Instantly share code, notes, and snippets.

@aChase55
Created May 2, 2019 10:32
Show Gist options
  • Save aChase55/733ea89af1bfa80c65971d3bc691f0b2 to your computer and use it in GitHub Desktop.
Save aChase55/733ea89af1bfa80c65971d3bc691f0b2 to your computer and use it in GitHub Desktop.
QR Scanner
import Foundation
import AVFoundation
import UIKit
//MARK:- UIViewController
class QRScanningViewController: UIViewController {
@IBOutlet weak var previewView: PreviewView!
let qrScanner:QRScanner = QRScanner()
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
qrScanner.previewView = previewView
qrScanner.delegate = self
previewView.videoPreviewLayer.videoGravity = .resizeAspectFill
qrScanner.session.startRunning()
}
}
extension QRScanningViewController: QRScannerDelegate {
func scannerDetected(item:Any) {
DispatchQueue.main.async {[weak self] in
guard let message = item as? String else { return }
let alert = UIAlertController.init(title: "Scanned", message: message, preferredStyle: .alert)
let confirmAction = UIAlertAction(title: "OK", style: .cancel, handler: nil)
alert.addAction(confirmAction)
self?.present(alert, animated: true)
}
}
}
//MARK:- QR Scanner
protocol QRScannerDelegate: class {
func scannerDetected(item:Any)
}
class QRScanner: NSObject {
let session = AVCaptureSession()
let qrScanQueue = DispatchQueue(label: "com.myApp.qrScanQueue")
weak var delegate:QRScannerDelegate?
weak var previewView:PreviewView? {
didSet {
previewView?.videoPreviewLayer.session = session
}
}
override init() {
super.init()
guard
let videoDevice = AVCaptureDevice.default(for: .video),
let deviceInput = try? AVCaptureDeviceInput(device: videoDevice)
else { return }
session.addInput(deviceInput)
let dataOutput = AVCaptureMetadataOutput()
session.addOutput(dataOutput)
dataOutput.metadataObjectTypes = [.qr]
dataOutput.setMetadataObjectsDelegate(self, queue: qrScanQueue)
}
}
extension QRScanner: AVCaptureMetadataOutputObjectsDelegate {
func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
guard
let readableCode = metadataObjects.first as? AVMetadataMachineReadableCodeObject,
let readableString = readableCode.stringValue
else { return }
delegate?.scannerDetected(item: readableString)
}
}
//MARK:- Preview View
class PreviewView: UIView {
override class var layerClass: AnyClass {
return AVCaptureVideoPreviewLayer.self
}
var videoPreviewLayer: AVCaptureVideoPreviewLayer {
return layer as! AVCaptureVideoPreviewLayer
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment