QRCode扫描仪不能在iOS 11中工作,只显示相机预览

问题描述:

它只显示相机的输出,但没有什么好看的。我不知道有什么问题。QRCode扫描仪不能在iOS 11中工作,只显示相机预览

我的代码是:

class QRScannerController: UIViewController, AVCaptureMetadataOutputObjectsDelegate { 

     var captureSession:AVCaptureSession? 
     var videoPreviewLayer:AVCaptureVideoPreviewLayer? 
     var qrCodeFrameView:UIView? 
let supportedCodeTypes = [AVMetadataObject.ObjectType.qr] 
     var resultString = "" 



override func viewDidLoad() { 
     super.viewDidLoad() 

     guard let captureDevice = AVCaptureDevice.default(for: AVMediaType.video) else {return} 

     do { 
      let input = try AVCaptureDeviceInput(device: captureDevice) 
      captureSession = AVCaptureSession() 
      captureSession?.addInput(input) 
      let captureMetadataOutput = AVCaptureMetadataOutput() 
      captureSession?.addOutput(captureMetadataOutput) 

      captureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) 
      captureMetadataOutput.metadataObjectTypes = supportedCodeTypes 

      videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!) 
      videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill 
      videoPreviewLayer?.frame = view.layer.bounds 
      view.layer.addSublayer(videoPreviewLayer!) 

      captureSession?.startRunning() 

      qrCodeFrameView = UIView() 

      if let qrCodeFrameView = qrCodeFrameView { 
       qrCodeFrameView.layer.borderColor = UIColor.green.cgColor 
       qrCodeFrameView.layer.borderWidth = 2 
       self.view.addSubview(qrCodeFrameView) 
       self.view.bringSubview(toFront: qrCodeFrameView) 
      } 

      captureSession?.startRunning() 

     } catch { 
      // If any error occurs, simply print it out and don't continue any more. 
      print(error) 
      return 
     } 
    } 

代表:

// MARK: - AVCaptureMetadataOutputObjectsDelegate Methods 

    func metadataOutput(captureOutput: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) { 

     if metadataObjects.count == 0 { 
      qrCodeFrameView?.frame = CGRect.zero 
      //messageLabel.text = "No QR/barcode is detected" 
      print("No QR/barcode is detected") 
      return 
     } 

     let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject 

     if supportedCodeTypes.contains(metadataObj.type) { 

      let barCodeObject = videoPreviewLayer?.transformedMetadataObject(for: metadataObj) 
      qrCodeFrameView?.frame = barCodeObject!.bounds 

      if metadataObj.stringValue != nil { 


       print(metadataObj.stringValue as Any) 
      } 
     } 
    } 

我试图把断点来调试,但无论是断点的获得委托法进行烧结。

有谁知道为什么会发生这种情况?

谢谢!

你的委托方法是错误的。更换

func metadataOutput(captureOutput: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) 

func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) 
+0

应标记为重复你已经有足够的信誉做 –

+0

对不起,我不知道,这是一个重复的(不是*确切*复制虽然)。 – the4kman

+0

谢谢@ the4kman ... !!! –