Прямо сейчас в моем приложении камеры я позволяю пользователю касаться любого места, чтобы установить фокус и экспозицию, но как я могу получить лучшее из обоих миров, как в приложении Apple Camera?
Например, пользователь может захотеть коснуться, чтобы сфокусироваться на чем-то, что находится на переднем плане, но если сцена достаточно изменится, он должен вернуться к непрерывному автофокусу. То же самое, если пользователь направляет камеру на источник света, она должна изменить экспозицию, чтобы свет отображался правильно, а затем, когда камера возвращается к сцене, она должна снова зафиксировать экспозицию, чтобы она не была слишком темной. Тем не менее, у них все еще есть возможность сделать его немного светлее или темнее в зависимости от того, к чему они прикасаются в поле зрения камеры.
Прямо сейчас я устанавливаю свои значения по умолчанию в центр экрана, когда появляется представление:
func setDefaultFocusAndExposure() {
let focusPoint = CGPoint(x:0.5,y:0.5)
if let device = AVCaptureDevice.default(for:AVMediaType.video) {
do {
try device.lockForConfiguration()
if device.isFocusPointOfInterestSupported {
print(focusPoint)
device.focusPointOfInterest = focusPoint
device.focusMode = AVCaptureDevice.FocusMode.autoFocus
}
if device.isExposurePointOfInterestSupported {
device.exposurePointOfInterest = focusPoint
device.exposureMode = AVCaptureDevice.ExposureMode.autoExpose
}
device.unlockForConfiguration()
} catch {
// Handle errors here
print("There was an error focusing the device's camera")
}
}
}
Также я позволяю пользователю устанавливать фокус и экспозицию в зависимости от того, где они касаются:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let bounds = UIScreen.main.bounds
let touchPoint = touches.first! as UITouch
let screenSize = bounds.size
let focusPoint = CGPoint(x: touchPoint.location(in: view).y / screenSize.height, y: 1.0 - touchPoint.location(in: view).x / screenSize.width)
if let device = AVCaptureDevice.default(for:AVMediaType.video) {
do {
try device.lockForConfiguration()
if device.isFocusPointOfInterestSupported {
device.focusPointOfInterest = focusPoint
device.focusMode = AVCaptureDevice.FocusMode.autoFocus
}
if device.isExposurePointOfInterestSupported {
device.exposurePointOfInterest = focusPoint
device.exposureMode = AVCaptureDevice.ExposureMode.autoExpose
}
device.unlockForConfiguration()
} catch {
// Handle errors here
print("There was an error focusing the device's camera")
}
}
}