如何扫描button上的QR码?

我正在使用https://www.hackingwithswift.com/example-code/media/how-to-scan-a-qr-code提供的代码来制作我自己的扫描应用程序。 但我喜欢我的扫描发生在button按下。 现在,我把教程中的viewDidLoad()部分放到它自己的函数中:

 func cameraScanningLayer(){ view.backgroundColor = UIColor.blackColor() captureSession = AVCaptureSession() let videoCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) let videoInput: AVCaptureDeviceInput do { videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice) } catch { return } if (captureSession.canAddInput(videoInput)) { captureSession.addInput(videoInput) } else { failed(); return; } let metadataOutput = AVCaptureMetadataOutput() if (captureSession.canAddOutput(metadataOutput)) { captureSession.addOutput(metadataOutput) metadataOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue()) // need to scan barcode + QRcode metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypePDF417Code,AVMetadataObjectTypeCode128Code,AVMetadataObjectTypeCode39Code] } else { failed() return } // Previewlayer with camera previewLayer = AVCaptureVideoPreviewLayer(session: captureSession); previewLayer.frame = viewForLayer.bounds; previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; viewForLayer.layer.addSublayer(previewLayer); captureSession.startRunning(); } 

而一个button操作调用该函数:

 func buttonScanAction() { print("Scan") scanEnabled = true // like to use some kind of bool/switch self.cameraScanningLayer() } 

我有的问题是:

1)载入时相机不在视野中

2)按下button后,照相机可以看到,但它总是自动扫描

所以我想到了使用全球的:

 var scanEnabled: Bool = false 

然后,单击该button时,将其设置为true并启用扫描。

这里供参考是一个草图:

在这里输入图像说明

编辑我的快速修复,这可能不是正确的做法。

我replace了

  let metadataOutput = AVCaptureMetadataOutput() {...} else { failed() return } 

并把它放在if语句之间

 if (scanEnabled == true) { let metadataOutput = AVCaptureMetadataOutput() if (captureSession.canAddOutput(metadataOutput)) { captureSession.addOutput(metadataOutput) metadataOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue()) // to use them both wwe need to skip AVMetadataObjectTypeQRCode metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypePDF417Code,AVMetadataObjectTypeCode128Code,AVMetadataObjectTypeCode39Code] scanEnabled = false } else { failed() return } } 

这篇教程的作者在这里。 我的方法是使用专用的扫描视图控制器,但我想你想与你现有的视图控制器统一 – 这很好。 两种方法都有效。

如果您想一直显示相机界面(即使不主动识别QR码),那么您计划使用布尔值来跟踪是否启用扫描是一个好方法。 我的示例代码有一个被调用的foundCode()方法,并且在find代码时也调用dismissViewControllerAnimated()

在你的版本中,你需要使foundCode()完成停止foundCode() ,处理解雇等所有的工作。然后你可以在一个地方添加一个scanEnabled布尔检查。

像这样的东西应该这样做:

 func foundCode(code: String) { if scanCode == true { print(code) captureSession.stopRunning() AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate)) dismissViewControllerAnimated(true, completion: nil) } } 

如果你想,你可以移动scanCode == true检查didOutputMetadataObjects保存不必要的方法调用。

Interesting Posts