我用这段代码在iOS自定义相机应用中实现了点击对焦,但它不起作用。
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
let touchPer = touches.anyObject() as UITouch
let screenSize = UIScreen.mainScreen().bounds.size
var focus_x = touchPer.locationInView(self.view).x / screenSize.width
var focus_y = touchPer.locationInView(self.view).y / screenSize.height
if let device = captureDevice {
if(device.lockForConfiguration(nil)) {
device.focusMode = AVCaptureFocusMode.ContinuousAutoFocus
device.focusPointOfInterest = CGPointMake(focus_x, focus_y)
device.exposureMode = AVCaptureExposureMode.ContinuousAutoExposure
device.unlockForConfiguration()
}
}
}
8条答案
按热度按时间nhhxz33t1#
使用
videoView: UIView
显示视频,并且使用cameraDevice: AVCaptureDevice
,下面的代码似乎对我有效:请注意,我必须交换
x
和y
坐标,并将x
坐标从1重新Map到0,而不是从0Map到1 -不知道为什么会这样,但似乎有必要让它正常工作(尽管测试它也有点棘手)。编辑:Apple的文档解释了坐标变换的原因。
此外,设备可能支持感兴趣的焦点。您可以使用focusPointOfInterestSupported测试是否支持。如果支持,则使用focusPointOfInterest设置焦点。您传递一个CGPoint,其中{0,0}表示图片区域的左上角,{1,1}表示横向模式下的右下角,主页按钮位于右侧-即使设备处于纵向模式,这也适用。
在我的示例中,我使用了
.ContinuousAutoFocus
和.ContinuousAutoExposure
,但文档指出.AutoFocus
是正确的选择。奇怪的是,文档没有提到.AutoExpose
,但我在代码中使用了它,它工作得很好。我还修改了我的示例代码以包含
.focusPointOfInterestSupported
和.exposurePointOfInterestSupported
测试-文档中还提到,在设置之前,对给定的聚焦/曝光模式使用isFocusModeSupported:
和isExposureModeSupported:
方法来测试它在给定的设备上是否可用,但我假设如果设备支持兴趣点模式,那么它也支持自动模式。这一切似乎在我的应用程序中运行良好。unftdfkk2#
Swift 3.0解决方案
用Swift 3将Cody的答案转换为工作解决方案。
toe950273#
我不知道为什么会这样,但确实如此。
0vvn1miw4#
你应该在
focusPointOfInterest
上读一读Apple docs,它说了三件重要的事情:1.设置此属性的值不会启动聚焦操作。若要将照相机聚焦在感兴趣的点上,请首先设置此属性的值,然后将focusMode属性设置为autoFocus或continuousAutoFocus。
1.此属性的CGPoint值使用一个坐标系,其中{0,0}是图片区域的左上角,{1,1}是右下角。此坐标系始终相对于横向设备方向,主页按钮在右侧,而与实际的设备方向无关。您可以使用AVCaptureVideoPreviewLayer方法在此坐标系和视图坐标之间进行转换。
1.在更改此属性的值之前,必须调用lockForConfiguration()以获取对设备配置属性的独占访问权限。否则,设置此属性的值将引发异常。配置完设备后,请调用unlockForConfiguration()以释放锁定并允许其他设备配置设置。
下面是一个实现,它可以完成所有这些任务:
qmb5sa225#
设置焦点兴趣点的更好方法:
i2byvkas6#
您必须以正确的顺序调用这些方法:
在设置聚焦模式之前设置关注点,否则将在前一个关注点上进行聚焦。
这同样适用于
exposurePointOfInterest
。fdbelqdn7#
Swift 5.0版本
k2arahey8#
雨燕4: