Fixing the scan duplicates #127

This commit is contained in:
Yannick Loriot 2017-11-28 22:50:44 +01:00
parent 7143dc37b7
commit 38e0be6b72
2 changed files with 19 additions and 13 deletions

View File

@ -36,8 +36,10 @@ class ViewController: UIViewController, QRCodeReaderViewControllerDelegate {
lazy var reader: QRCodeReader = QRCodeReader()
lazy var readerVC: QRCodeReaderViewController = {
let builder = QRCodeReaderViewControllerBuilder {
$0.reader = QRCodeReader(metadataObjectTypes: [.qr], captureDevicePosition: .back)
$0.reader = QRCodeReader(metadataObjectTypes: [.qr], captureDevicePosition: .back)
$0.showTorchButton = true
$0.reader.stopScanningWhenCodeIsFound = false
}
return QRCodeReaderViewController(builder: builder)

View File

@ -156,7 +156,7 @@ public final class QRCodeReader: NSObject, AVCaptureMetadataOutputObjectsDelegat
metadataOutput.setMetadataObjectsDelegate(self, queue: metadataObjectsQueue)
let allTypes = Set(metadataOutput.availableMetadataObjectTypes)
let filtered = metadataObjectTypes.filter { (mediaType) -> Bool in
allTypes.contains(mediaType)
allTypes.contains(mediaType)
}
metadataOutput.metadataObjectTypes = filtered
previewLayer.videoGravity = .resizeAspectFill
@ -361,25 +361,29 @@ public final class QRCodeReader: NSObject, AVCaptureMetadataOutputObjectsDelegat
// MARK: - AVCaptureMetadataOutputObjects Delegate Methods
public func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
for current in metadataObjects {
if let _readableCodeObject = current as? AVMetadataMachineReadableCodeObject {
if _readableCodeObject.stringValue != nil {
if metadataObjectTypes.contains(_readableCodeObject.type) {
if let sVal = _readableCodeObject.stringValue {
if stopScanningWhenCodeIsFound {
stopScanning()
sessionQueue.async { [weak self] in
guard let weakSelf = self else { return }
for current in metadataObjects {
if let _readableCodeObject = current as? AVMetadataMachineReadableCodeObject {
if _readableCodeObject.stringValue != nil {
if weakSelf.metadataObjectTypes.contains(_readableCodeObject.type) {
guard weakSelf.session.isRunning, let sVal = _readableCodeObject.stringValue else { return }
if weakSelf.stopScanningWhenCodeIsFound {
weakSelf.session.stopRunning()
}
let scannedResult = QRCodeReaderResult(value: sVal, metadataType:_readableCodeObject.type.rawValue)
DispatchQueue.main.async(execute: { [weak self] in
self?.didFindCode?(scannedResult)
})
DispatchQueue.main.async {
weakSelf.didFindCode?(scannedResult)
}
}
}
}
else {
didFailDecoding?()
weakSelf.didFailDecoding?()
}
}
}