Fixing the scan duplicates #127
This commit is contained in:
parent
7143dc37b7
commit
38e0be6b72
|
@ -36,8 +36,10 @@ class ViewController: UIViewController, QRCodeReaderViewControllerDelegate {
|
||||||
lazy var reader: QRCodeReader = QRCodeReader()
|
lazy var reader: QRCodeReader = QRCodeReader()
|
||||||
lazy var readerVC: QRCodeReaderViewController = {
|
lazy var readerVC: QRCodeReaderViewController = {
|
||||||
let builder = QRCodeReaderViewControllerBuilder {
|
let builder = QRCodeReaderViewControllerBuilder {
|
||||||
$0.reader = QRCodeReader(metadataObjectTypes: [.qr], captureDevicePosition: .back)
|
$0.reader = QRCodeReader(metadataObjectTypes: [.qr], captureDevicePosition: .back)
|
||||||
$0.showTorchButton = true
|
$0.showTorchButton = true
|
||||||
|
|
||||||
|
$0.reader.stopScanningWhenCodeIsFound = false
|
||||||
}
|
}
|
||||||
|
|
||||||
return QRCodeReaderViewController(builder: builder)
|
return QRCodeReaderViewController(builder: builder)
|
||||||
|
|
|
@ -156,7 +156,7 @@ public final class QRCodeReader: NSObject, AVCaptureMetadataOutputObjectsDelegat
|
||||||
metadataOutput.setMetadataObjectsDelegate(self, queue: metadataObjectsQueue)
|
metadataOutput.setMetadataObjectsDelegate(self, queue: metadataObjectsQueue)
|
||||||
let allTypes = Set(metadataOutput.availableMetadataObjectTypes)
|
let allTypes = Set(metadataOutput.availableMetadataObjectTypes)
|
||||||
let filtered = metadataObjectTypes.filter { (mediaType) -> Bool in
|
let filtered = metadataObjectTypes.filter { (mediaType) -> Bool in
|
||||||
allTypes.contains(mediaType)
|
allTypes.contains(mediaType)
|
||||||
}
|
}
|
||||||
metadataOutput.metadataObjectTypes = filtered
|
metadataOutput.metadataObjectTypes = filtered
|
||||||
previewLayer.videoGravity = .resizeAspectFill
|
previewLayer.videoGravity = .resizeAspectFill
|
||||||
|
@ -361,25 +361,29 @@ public final class QRCodeReader: NSObject, AVCaptureMetadataOutputObjectsDelegat
|
||||||
// MARK: - AVCaptureMetadataOutputObjects Delegate Methods
|
// MARK: - AVCaptureMetadataOutputObjects Delegate Methods
|
||||||
|
|
||||||
public func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
|
public func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
|
||||||
for current in metadataObjects {
|
sessionQueue.async { [weak self] in
|
||||||
if let _readableCodeObject = current as? AVMetadataMachineReadableCodeObject {
|
guard let weakSelf = self else { return }
|
||||||
if _readableCodeObject.stringValue != nil {
|
|
||||||
if metadataObjectTypes.contains(_readableCodeObject.type) {
|
for current in metadataObjects {
|
||||||
if let sVal = _readableCodeObject.stringValue {
|
if let _readableCodeObject = current as? AVMetadataMachineReadableCodeObject {
|
||||||
if stopScanningWhenCodeIsFound {
|
if _readableCodeObject.stringValue != nil {
|
||||||
stopScanning()
|
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)
|
let scannedResult = QRCodeReaderResult(value: sVal, metadataType:_readableCodeObject.type.rawValue)
|
||||||
|
|
||||||
DispatchQueue.main.async(execute: { [weak self] in
|
DispatchQueue.main.async {
|
||||||
self?.didFindCode?(scannedResult)
|
weakSelf.didFindCode?(scannedResult)
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
didFailDecoding?()
|
weakSelf.didFailDecoding?()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue