AVCaptureMetadataOutput().rectOfInterest 不工作
AVCaptureMetadataOutput().rectOfInterest not Working
我正在构建一个具有重叠框的 UIView
,最终目标是让 QR 码 reader 仅在 QR 落入框内时触发。我知道我需要将 .rectOfInterest()
设置为与黄色框相同,但在当前实现中(下面的代码),reader 不起作用。
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)
}
}
请帮我对齐盒子和二维码reader。
首先,您是否正在提交会话配置并启动捕获会话?
session.commitConfiguration()
session.startRunning()
接下来需要将UIView
的坐标表示的rect转换成AVCaptureVideoPreviewLayer
的坐标系:
output.rectOfInterest = video.metadataOutputRectConverted(fromLayerRect: scannerRect)
最后,您可能需要调整事情的顺序。我 运行 遇到了感兴趣的矩形不能正常工作的问题。事实证明,在视图完全布局之前设置 rectOfInterest
可能会导致它无法按预期工作。
在 iOS 11 及更高版本上,我在视图 safeAreaInsetsDidChange
内设置 rectOfInterest
,然后启动相机。
在 iOS 10 及更低版本中,我在视图控制器的 viewWillAppear
中执行此操作。
我正在构建一个具有重叠框的 UIView
,最终目标是让 QR 码 reader 仅在 QR 落入框内时触发。我知道我需要将 .rectOfInterest()
设置为与黄色框相同,但在当前实现中(下面的代码),reader 不起作用。
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)
}
}
请帮我对齐盒子和二维码reader。
首先,您是否正在提交会话配置并启动捕获会话?
session.commitConfiguration()
session.startRunning()
接下来需要将UIView
的坐标表示的rect转换成AVCaptureVideoPreviewLayer
的坐标系:
output.rectOfInterest = video.metadataOutputRectConverted(fromLayerRect: scannerRect)
最后,您可能需要调整事情的顺序。我 运行 遇到了感兴趣的矩形不能正常工作的问题。事实证明,在视图完全布局之前设置 rectOfInterest
可能会导致它无法按预期工作。
在 iOS 11 及更高版本上,我在视图 safeAreaInsetsDidChange
内设置 rectOfInterest
,然后启动相机。
在 iOS 10 及更低版本中,我在视图控制器的 viewWillAppear
中执行此操作。