С videoView: UIView
отображающее видео, и cameraDevice: AVCaptureDevice
, следующий, кажется, работает для меня:
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
var touchPoint = touches.first as! UITouch
var screenSize = videoView.bounds.size
var focusPoint = CGPoint(x: touchPoint.locationInView(videoView).y/screenSize.height, y: 1.0 - touchPoint.locationInView(videoView.x/screenSize.width)
if let device = cameraDevice {
if(device.lockForConfiguration(nil)) {
if device.focusPointOfInterestSupported {
device.focusPointOfInterest = focusPoint
device.focusMode = AVCaptureFocusMode.AutoFocus
}
if device.exposurePointOfInterestSupported {
device.exposurePointOfInterest = focusPoint
device.exposureMode = AVCaptureExposureMode.AutoExpose
}
device.unlockForConfiguration()
}
}
}
Обратите внимание, что я должен был поменять x
и y
координаты, и переназначить x
коорд от 1 до 0 вместо 0 до 1 - не уверен, почему это должно быть так, но, похоже, необходимо, чтобы он работал правильно (хотя и немного сложно проверить его).
Редактировать: Apple's documentation объясняет причину преобразования координат.
Кроме того, устройство может поддерживать точку фокусировки. Вы тестируете поддержку с помощью focusPointOfInterestSupported. Если он поддерживается, вы устанавливаете фокус с помощью focusPointOfInterest. Вы передаете CGPoint, где {0,0} представляет верхнюю левую часть области изображения, а {1,1} представляет нижний правый в альбомном режиме с кнопкой «домой» справа - это применяется, даже если устройство находится в портретном режиме ,
В моем примере я использовал .ContinuousAutoFocus
и .ContinuousAutoExposure
, но документация указывает .AutoFocus
является правильным выбором. Как ни странно, в документации нет упоминания о .AutoExpose
, но я использую его в своем коде, и он отлично работает.
Я также изменил мой пример кода для включения .focusPointOfInterestSupported
и .exposurePointOfInterestSupported
тесты - документация также упоминает, используя методы isFocusModeSupported:
и isExposureModeSupported:
для режима данного фокуса/экспозиции, чтобы проверить, является ли она доступна на данном устройстве перед установкой, но я предположим, что устройство поддерживает режимы интереса, а также поддерживает автоматические режимы. Кажется, все хорошо работает в моем приложении.
Что об этом не работает? Какие ошибки возникают? Каково ожидаемое поведение? Каково фактическое поведение? –
Я касаюсь точки. и в этот момент следует сосредоточиться. но нет никакого эффекта. он не фокусируется в этой точке. вместо этого он всегда находится в фокусе бесконечности. Это проблема. @David – Krishna
Прошли ли вы через него, чтобы застраховать оба взятых? –