在 iOS7 中,这现在是可能的!
Apple 已将属性 autoFocusRangeRestriction 添加到 AVCaptureDevice 类。此属性属于枚举 AVCaptureAutoFocusRangeRestriction,它具有三个不同的值:
- AVCaptureAutoFocusRangeRestrictionNone - 默认,无限制
- AVCaptureAutoFocusRangeRestrictionNear - 重要的主体靠近相机
- AVCaptureAutoFocusRangeRestrictionFar - 重要的主体远离相机
要检查该方法是否可用,我们应该首先检查属性 autoFocusRangeRestrictionSupported 是否为真。而且由于它仅在 iOS7 及更高版本中受支持,我们还应该使用 respondsToSelector,这样我们就不会在早期的 iOS 版本中遇到异常。
所以生成的代码应该是这样的:
AVCaptureDevice *cameraDevice = zbarReaderView.device;
if ([cameraDevice respondsToSelector:@selector(isAutoFocusRangeRestrictionSupported)] && cameraDevice.autoFocusRangeRestrictionSupported) {
// If we are on an iOS version that supports AutoFocusRangeRestriction and the device supports it
// Set the focus range to "near"
if ([cameraDevice lockForConfiguration:nil]) {
cameraDevice.autoFocusRangeRestriction = AVCaptureAutoFocusRangeRestrictionNear;
[cameraDevice unlockForConfiguration];
}
}
根据我的初步测试,这似乎在某种程度上加快了小 QR 码的扫描速度:)
更新 - iOS8
在 iOS8 中,Apple 为我们提供了许多新的相机 API 供我们使用。这种新方法之一是:
- (void)setFocusModeLockedWithLensPosition:(float)lensPosition completionHandler:(void (^)(CMTime syncTime))handler
此方法通过将镜头移动到 0.0 和 1.0 之间的位置来锁定焦点。我玩弄了这个方法,将镜头锁定在接近的值。但是,总的来说,它引起的问题比解决的问题多。您必须将 QR 码/条形码保持在非常特定的距离,当您拥有不同大小的代码时,这可能会导致问题。
但。我想我找到了一个很好的替代方法来完全锁定焦点。当用户按下扫描按钮时,我将镜头锁定在近距离,完成后我将相机切换回自动对焦。这为我们提供了保持自动对焦的好处,但会迫使相机在可能找到 QR 码/条形码的近距离开始。这结合:
cameraDevice.autoFocusRangeRestriction = AVCaptureAutoFocusRangeRestrictionNear;
和:
cameraDevice.focusPointOfInterest = CGPointMake(0.5,0.5);
结果是一个非常活泼的扫描仪。我还使用 iOS7 中引入的 API 构建了一个自定义扫描仪,而不是使用 ZBar。主要是因为 ZBar-libs 已经过时了,当 iPhone 5 引入 ARMv7s 时,我现在不得不为 ARM64 重新编译它。
// 亚历山大