【问题标题】:QRCode Scanner Not Working in iOS 11, only showing camera preview [duplicate]QRCode扫描仪在iOS 11中不起作用,仅显示相机预览[重复]
【发布时间】:2017-10-05 13:35:44
【问题描述】:

它只显示相机的输出,但没有发生任何事情。不知道是什么问题。

我的代码是:

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

代表:

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

我尝试通过放置断点进行调试,但委托方法中没有一个断点被触发。

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

谢谢!

【问题讨论】:

    标签: ios swift qr-code swift4 avcapture


    【解决方案1】:

    您的委托方法是错误的。替换

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

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

    【讨论】:

    • 应该被标记为重复你已经有足够的声誉来做它
    • 抱歉,我不知道这是重复的(虽然不是完全重复)。
    • 感谢@the4kman... !!!
    猜你喜欢
    • 2015-07-19
    • 2018-06-17
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2018-03-09
    • 2020-12-03
    相关资源
    最近更新 更多