本文介绍了AVCaptureMetadataOutput().rectOfInterest不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在构建一个UIView,它有一个覆盖的盒子,最终目标是让二维码读取器仅在二维码落入盒子内时触发。我知道我需要将.rectOfInterest()设置为与黄色框相同,但在当前实现中(下面的代码),阅读器无法工作。

public override init(frame: CGRect) {
    super.init(frame: frame)

    if let captureDevice = AVCaptureDevice.default(for: .video) {
        do {
            let input = try AVCaptureDeviceInput(device: captureDevice)
            session.addInput(input)
        } catch {
            print("Error")
        }

        let scannerRect = CGRect(x: self.center.x - (self.frame.width * 0.667 / 2), y: self.frame.width * 0.667 / 4, width: self.frame.width * 0.667, height: self.frame.width * 0.667)

        let output = AVCaptureMetadataOutput()
        output.rectOfInterest = scannerRect
        session.addOutput(output)

        output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
        output.metadataObjectTypes = [.qr]

        video = AVCaptureVideoPreviewLayer(session: session)
        video.frame = self.layer.bounds

        scannerBounds.frame = scannerRect
        scannerBounds.borderColor = UIColor.yellow.cgColor
        scannerBounds.borderWidth = 5

        self.layer.addSublayer(video)
        self.layer.insertSublayer(scannerBounds, above: video)
    }
}

请帮我将盒子和二维码读取器对齐。

推荐答案

首先,您是否正在提交会话配置并启动捕获会话?

session.commitConfiguration()
session.startRunning()

接下来,您需要将UIView的坐标中表示的RECT转换为AVCaptureVideoPreviewLayer的坐标系:

output.rectOfInterest = video.metadataOutputRectConverted(fromLayerRect: scannerRect)

最后,您可能需要调整事情的顺序。我遇到了感兴趣的RECT不能正常工作的问题。结果是,在视图完全布局之前设置rectOfInterest可能会导致它无法按预期工作。

在iOS 11和更高版本上,我在查看器的safeAreaInsetsDidChange内部设置rectOfInterest,然后启动摄像头。

在iOS 10及更低版本上,我在视图控制器的viewWillAppear中执行此操作。

这篇关于AVCaptureMetadataOutput().rectOfInterest不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-19 03:18