Прямоугольник фокуса выставки камеры iphone
Я клонирую приложение камеры Apple, используя AVCaptureSession на основе примера приложения Apple AppCam. Проблема в том, что я не вижу прямоугольник фокуса на экране предварительного просмотра видео. Я использовал следующий код для настройки фокуса, но прямоугольник фокуса не отображается.
AVCaptureDevice *device = [[self videoInput] device];
if ([device isFocusModeSupported:focusMode] && [device focusMode] != focusMode) {
NSError *error;
printf(" setFocusMode \n");
if ([device lockForConfiguration:&error]) {
[device setFocusMode:focusMode];
[device unlockForConfiguration];
} else {
id delegate = [self delegate];
if ([delegate respondsToSelector:@selector(acquiringDeviceLockFailedWithError:)]) {
[delegate acquiringDeviceLockFailedWithError:error];
}
}
}
Когда я использую UIImagePickerController, автофокус, фокус касания поддерживаются по умолчанию и могут видеть прямоугольник фокуса. Нет ли способа показать прямоугольник фокуса в слое предварительного просмотра видео с помощью AVCaptureSession?
3 ответа
Фокусная анимация - это полная пользовательская анимация, которую вы должны создать самостоятельно. В настоящее время у меня точно такая же проблема, как у вас: я хочу показать прямоугольник в качестве обратной связи для пользователя после того, как он коснулся слоя предварительного просмотра.
Первое, что вы хотите сделать, это реализовать касание к фокусу, вероятно, там, где вы инициируете слой предварительного просмотра:
UITapGestureRecognizer *tapGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapToFocus:)];
[tapGR setNumberOfTapsRequired:1];
[tapGR setNumberOfTouchesRequired:1];
[self.captureVideoPreviewView addGestureRecognizer:tapGR];
Теперь реализуем сам метод касания к фокусу:
-(void)tapToFocus:(UITapGestureRecognizer *)singleTap{
CGPoint touchPoint = [singleTap locationInView:self.captureVideoPreviewView];
CGPoint convertedPoint = [self.captureVideoPreviewLayer captureDevicePointOfInterestForPoint:touchPoint];
AVCaptureDevice *currentDevice = currentInput.device;
if([currentDevice isFocusPointOfInterestSupported] && [currentDevice isFocusModeSupported:AVCaptureFocusModeAutoFocus]){
NSError *error = nil;
[currentDevice lockForConfiguration:&error];
if(!error){
[currentDevice setFocusPointOfInterest:convertedPoint];
[currentDevice setFocusMode:AVCaptureFocusModeAutoFocus];
[currentDevice unlockForConfiguration];
}
}
}
Последнее, что я еще не реализовал, - это добавление фокусирующей анимации к слою предварительного просмотра или, вернее, к контроллеру представления, который содержит слой предварительного просмотра. Я считаю, что это можно сделать в tapToFocus:. Там у вас уже есть точка соприкосновения. Просто добавьте анимированный вид изображения или какой-либо другой вид, который имеет сенсорную позицию в качестве центра. После завершения анимации удалите изображение.
Быстрая реализация
Жест:
private func focusGesture() -> UITapGestureRecognizer {
let tapRec: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(kTapToFocus))
tapRec.cancelsTouchesInView = false
tapRec.numberOfTapsRequired = 1
tapRec.numberOfTouchesRequired = 1
return tapRec
}
Действие:
private func tapToFocus(gesture : UITapGestureRecognizer) {
let touchPoint:CGPoint = gesture.locationInView(self.previewView)
let convertedPoint:CGPoint = previewLayer!.captureDevicePointOfInterestForPoint(touchPoint)
let currentDevice:AVCaptureDevice = videoDeviceInput!.device
if currentDevice.focusPointOfInterestSupported && currentDevice.isFocusModeSupported(AVCaptureFocusMode.AutoFocus){
do {
try currentDevice.lockForConfiguration()
currentDevice.focusPointOfInterest = convertedPoint
currentDevice.focusMode = AVCaptureFocusMode.AutoFocus
currentDevice.unlockForConfiguration()
} catch {
}
}
}
реализация swift3
lazy var focusGesture: UITapGestureRecognizer = {
let instance = UITapGestureRecognizer(target: self, action: #selector(tapToFocus(_:)))
instance.cancelsTouchesInView = false
instance.numberOfTapsRequired = 1
instance.numberOfTouchesRequired = 1
return instance
}()
func tapToFocus(_ gesture: UITapGestureRecognizer) {
guard let previewLayer = previewLayer else {
print("Expected a previewLayer")
return
}
guard let device = device else {
print("Expected a device")
return
}
let touchPoint: CGPoint = gesture.location(in: cameraView)
let convertedPoint: CGPoint = previewLayer.captureDevicePointOfInterest(for: touchPoint)
if device.isFocusPointOfInterestSupported && device.isFocusModeSupported(AVCaptureFocusMode.autoFocus) {
do {
try device.lockForConfiguration()
device.focusPointOfInterest = convertedPoint
device.focusMode = AVCaptureFocusMode.autoFocus
device.unlockForConfiguration()
} catch {
print("unable to focus")
}
}
}