用于捕获QR码的代码在Xcode8和Swift3中似乎运行不佳



我试图在Swift3和iOS 10 beta设备中使用AVCaptureMetadataOutputObjectsDelegate捕获QR码。

但是当QR码被设备的摄像头实际捕获时,captureOutput函数没有被调用。

有人有解决这个问题的办法吗?如果是这样,请让我知道如何修复和正常工作。



谢谢你,

import UIKit
import AVFoundation
class ViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
  override func viewDidLoad() {
    super.viewDidLoad()
    let mySession: AVCaptureSession! = AVCaptureSession()
    let devices = AVCaptureDevice.devices()
    var myDevice: AVCaptureDevice!
    for device in devices! {
      if((device as AnyObject).position == AVCaptureDevicePosition.back){
        myDevice = device as! AVCaptureDevice
      }
    }
    let myVideoInput = try! AVCaptureDeviceInput.init(device: myDevice)
    if mySession.canAddInput(myVideoInput) {
      mySession.addInput(myVideoInput)
    }
    let myMetadataOutput: AVCaptureMetadataOutput! = AVCaptureMetadataOutput()
    if mySession.canAddOutput(myMetadataOutput) {
      mySession.addOutput(myMetadataOutput)
      myMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
      myMetadataOutput.metadataObjectTypes = [AVMetadataObjectTypeQRCode]
    }
    let myVideoLayer = AVCaptureVideoPreviewLayer.init(session: mySession)
    myVideoLayer?.frame = self.view.bounds
    myVideoLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
    self.view.layer.addSublayer(myVideoLayer!)
    mySession.startRunning()
  }

  // MARK: - AVCaptureMetadataOutputObjectsDelegate
  // This function is not called despite capturing QR code  
  func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, from connection: AVCaptureConnection!) {
    if metadataObjects.count > 0 {
      let qrData: AVMetadataMachineReadableCodeObject  = metadataObjects[0] as! AVMetadataMachineReadableCodeObject
      print("(qrData.type)")
      print("(qrData.stringValue)")
    }
  }
}

在Swift 3中实现AVCaptureMetadataOutputObjectsDelegate的方法头是这样的:

func captureOutput(_ captureOutput: AVCaptureOutput!,
                   didOutputMetadataObjects metadataObjects: [Any]!,
                   from connection: AVCaptureConnection!) {

[AnyObject] -> [Any],我没有检查你的代码的其他部分,但至少,你需要修复这个

Swift 4中的委托方法

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

SWIFT 3:在我的例子中,这段代码解决了这个问题:

旧错误代码

private func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
    for item in metadataObjects {
        if let metadataObject = item as? AVMetadataMachineReadableCodeObject {
            if metadataObject.type == AVMetadataObjectTypeQRCode {
                print("QR Code: (metadataObject.stringValue)")
            }
        }
    }
}

正确答案

func captureOutput(_ captureOutput: AVCaptureOutput!,
                   didOutputMetadataObjects metadataObjects: [Any]!,
                   from connection: AVCaptureConnection!) {
    for item in metadataObjects {
        if let metadataObject = item as? AVMetadataMachineReadableCodeObject {
            if metadataObject.type == AVMetadataObjectTypeQRCode {
                print("QR Code: (metadataObject.stringValue)")
            }
        }
    }
}

最新更新