我正在使用AVCaptureSession创建一个带有AVCaptureMetadataOutput的QR码扫描程序。
一切都按预期工作,但我想在扫描仪上放置图形叠加层。在这样做时,我希望扫描仪仅在QR码位于帧的给定部分时才扫描。目前,它会在视图中的任何位置检测到QR码,我希望它只在屏幕中间触发。
这甚至可能吗?对于AVCapturePreviewLayer,我设置rectForMetadataOutputRectOfInterest但它似乎没有工作。也许我这样做错了?
有些见解会很棒。提前致谢!
答案 0 :(得分:0)
我还没有做到这一点,但是我相信这是可以实现的。您会看到,当您捕获AVCaptureMetadataOutput
时,可以使用AVCaptureVideoPreviewLayer
在视图中获取QR码框架,这在您要在捕获的QR周围绘制矩形时非常有用。
func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
guard let readableCode = metadataObjects.first as? AVMetadataMachineReadableCodeObject, let code = readableCode.stringValue else { return }
if let barcodeObject = videoPreview?.transformedMetadataObject(for: readableCode) {
qrCodeFrameView?.frame = barcodeObject.bounds
}
stopReading()
didRead?(code)
}
您可以使用barcodeObject
使用CGRect's contains(_:) method来询问您的矩形是否包含条形码
if qrReader.frame.contains(barcodeObject.bounds) {
stopReading()
didRead?(code)
}
我认为那可以/应该工作。