[英]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.