我昨天确实遇到了这个问题。事实证明,完全使用(0.5, 0.5) 存在问题。当我使用(0.51, 0.51) 时,它每次都有效?
extension AVCaptureDevice {
func change(_ block: (AVCaptureDevice) -> ()) {
try! self.lockForConfiguration()
block(self)
self.unlockForConfiguration()
}
}
@objc func handleTap() {
device.change {
$0.exposurePointOfInterest = CGPoint(x: 0.51, y: 0.51)
$0.exposureMode = .autoExpose
}
}
更新
还可能值得注意的是,虽然它是指定曝光的点,但该点周围的区域仍然必须足够大才能触发曝光调整。我们称之为触发区域。
从我的测试中了解到,(0.5, 0.5) 点对触发区域的大小有特殊影响。每当将此点作为exposurePointOfInterest时,无论exposureMode是.continuousAutoExpose还是.autoExpose,触发区域都比较大。
您可以使用以下代码了解该区域的大小,将手机指向明亮的区域(如灯),然后查看在轻按调整曝光之前您必须靠近多远。您会发现曝光确实会调整,但您必须非常接近。
@objc func handleTap() {
device.change {
$0.exposurePointOfInterest = CGPoint(x: 0.5, y: 0.5)
$0.exposureMode = .autoExpose
}
}
或者,您不能使用水龙头,而只需将属性exposureMode 和exposurePointOfInterest 保留为默认值.continuousAutoExpose 和(0.5, 0.5)。或者您可以使用本机相机应用程序并查看它何时自动调整曝光。结果是一样的。
现在,如果您将exposurePointOfInterest 设置为接近但不等于中点的值,例如(0.51, 0.51),您会发现触发区域变得非常非常小。
您也可以使用.continuousAutoExpose 并只调用一次,您会发现自动曝光调整要灵敏得多,因为触发区域要小得多:
func viewDidLoad() {
super.viewDidLoad()
device.change {
$0.exposurePointOfInterest = CGPoint(x: 0.51, y: 0.51)
$0.exposureMode = .continuousAutoExpose
}
}
要了解这个较小区域的大小,请打开本机相机应用并点按某处以在该点对焦/曝光。你会看到一个小的边界框。这差不多就是触发区域的大小。
假设你有这样的水龙头:
@objc func handleTap() {
device.change {
$0.exposurePointOfInterest = CGPoint(x: 0.51, y: 0.51)
$0.exposureMode = .autoExpose
}
}
如果没有任何反应,则该区域不够大,当您尝试在该点点按曝光时,您应该能够在原生相机应用中重现相同的无效果。
旁注
你的 didTap() 方法是设置默认值,所以它基本上没用。
如果您想通过点击调整曝光,如果点始终相同,请使用.autoExpose。不要使用.continuousAutoExpose,因为它会一直调整曝光,而不仅仅是点击。只有当点击会改变点时,这样做才有意义。