簡體   English   中英

用於捕獲QR代碼的代碼在Xcode8和Swift3中似乎無法正常工作

[英]Code for capturing QR Code doesn't seem working well in Xcode8 and 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)")
            }
        }
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM