ios - QRCode 扫描仪在 iOS 11 中不起作用,仅显示相机预览

标签 ios swift qr-code swift4 avcapture

<分区>

它只显示相机的输出,但没有任何反应。我不知道有什么问题。

我的代码是:

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

委托(delegate):

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

我尝试通过放置断点进行调试,但是在委托(delegate)方法中没有触发任何断点。

有人知道为什么会这样吗?

谢谢!

最佳答案

您的委托(delegate)方法有误。替换

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

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

关于ios - QRCode 扫描仪在 iOS 11 中不起作用,仅显示相机预览,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46587031/

相关文章:

react-native - 如何在 react-native-qrcode-scanner 中关闭相机/扫描仪?

swift - 在 SFSafariViewController 中打开从二维码扫描的 URL

ios - 有没有办法在iOS上生成二维码图片

ios - Twitter 帐户总是返回空白时间线?

ios - 创建播放声音的按钮,收到 NSException 错误

Swift Eureka - 自定义行 "cannot convert to expected argument type BaseRow"

swift - UIButton 不改变标题

android - 应用程序关闭时从 BLE 设备向手机推送通知或 Intent

ios - 无法将类型 'NSRange'(又名 '_NSRange')的值转换为预期类型 'Range<Index>'(又名 'Range<String.CharacterView.Index>')

ios - 自定义导航栏后退按钮标题