2017-10-05 11 views
3

Il affiche uniquement la sortie de l'appareil photo, mais rien ne se passe. Je ne sais pas quel est le problème.QRCode Scanner ne fonctionne pas dans iOS 11, affiche uniquement l'aperçu de la caméra

Mon code est:

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 
     } 
    } 

Délégué:

// 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) 
      } 
     } 
    } 

J'ai essayé de déboguer en mettant des points d'arrêt, mais aucun des points d'arrêt viré dans la méthode déléguée.

Est-ce que quelqu'un sait pourquoi cela se produit-il?

Merci!

Répondre

10

Votre méthode de délégation est incorrecte. Remplacer

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

avec

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

devrait être marqué comme doublon vous avez déjà assez réputation pour le faire –

+0

Désolé, je ne savais pas que c'était un double (pas * copie exacte * bien). – the4kman

+0

merci @ the4kman ... !!! –