AVCaptureMetadataOutput().rectOfInterest 不工作

Cal*_*cki 6 qr-code avcapturedevice cgrect swift

我正在构建一个UIView具有覆盖框的盒子,最终目标是让 QR 码阅读器仅在 QR 落在盒子内时才触发。我知道我需要将 设置.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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

fph*_*ipe 10

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

session.commitConfiguration()
session.startRunning()
Run Code Online (Sandbox Code Playgroud)

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

output.rectOfInterest = video.metadataOutputRectConverted(fromLayerRect: scannerRect)
Run Code Online (Sandbox Code Playgroud)

最后,您可能需要调整事情的顺序。我遇到了一个问题,即感兴趣的 rect 无法正常工作。事实证明,rectOfInterest在视图完全布局之前进行设置可能会导致它无法按预期工作。

在 iOS 11 及更高版本上,我rectOfInterest在视图内部进行设置safeAreaInsetsDidChange,然后启动相机。

在 iOS 10 及更低版本上,我在视图控制器的viewWillAppear.

  • 为我工作。为其他人着想:这就是我所做的……我有一个名为 startScanner() 的公共函数,它之前只是称为 `session.startRunning()`。但是,它现在有 1.`session.commitConfiguration`、2.`session.startRunning()`、3.`output.rectOfInterest = video.metadataOutputRectConverted(fromLayerRect:scannerRect)`。再次感谢您的帮助。 (2认同)