2013-04-05 12 views
8

Ich klicke Apples Kamera-App mit AVCaptureSession basierend auf AppCam app Apples Apples. Das Problem ist, dass ich das Fokusrechteck im Videovorschau-Bildschirm nicht sehen kann. Ich habe folgenden Code zum Einstellen des Fokus verwendet, aber das Fokus-Rechteck wird nicht angezeigt.iphone kamera show focus rechteck

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]; 
     } 
    }  
} 

Wenn ich UIImagePickerController verwenden, Autofokus, tippen Fokus werden standardmäßig unterstützt und kann Fokus-Rechteck sehen. Gibt es keine Möglichkeit, das Fokusrechteck in der Videovorschauebene mit AVCaptureSession anzuzeigen?

+0

hmm, scheint es niemand wissen thi s. – ttotto

Antwort

11

Die Fokusanimation ist eine komplette benutzerdefinierte Animation, die Sie selbst erstellen müssen. Ich habe gerade genau das gleiche Problem wie du: Ich möchte ein Rechteck als eine Rückmeldung für den Benutzer zeigen, nachdem er auf die Vorschauebene angetippt hat.

Das erste, was Sie tun möchten, ist der Tap-to-focus Umsetzung, in dem wahrscheinlich initiieren Sie die Vorschau Schicht:

UITapGestureRecognizer *tapGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapToFocus:)]; 
[tapGR setNumberOfTapsRequired:1]; 
[tapGR setNumberOfTouchesRequired:1]; 
[self.captureVideoPreviewView addGestureRecognizer:tapGR]; 

nun die Tap-to-focus implementieren Methode selbst:

-(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]; 
     }  
    } 
} 

Die letzte Sache, die ich noch nicht selbst implementiert habe, besteht darin, die Fokussierungsanimation der Vorschauebene bzw. dem View-Controller hinzuzufügen, der die Vorschauebene enthält. Ich glaube, das könnte in tapToFocus getan werden: Dort haben Sie bereits den Berührungspunkt. Fügen Sie einfach eine animierte Bildansicht oder eine andere Ansicht mit der Berührungsposition als Mittelpunkt hinzu. Wenn die Animation beendet ist, entfernen Sie die Bildansicht.

+1

Sie können auch einen Blick auf: http://stackoverflow.com/questions/15449271/avfoundation-tap-to-focus-feedback-rectangle Es gibt eine gute Beschreibung, wie Sie die Fokusanimation mit einem UIView implementieren – xxtesaxx

2

Swift Implementierung

Gesture:

private func focusGesture() -> UITapGestureRecognizer { 

    let tapRec: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(kTapToFocus)) 
    tapRec.cancelsTouchesInView = false 
    tapRec.numberOfTapsRequired = 1 
    tapRec.numberOfTouchesRequired = 1 

    return tapRec 
} 

Aktion:

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 { 

     } 
    } 

} 
0

swift3 Implementierung

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") 
     } 
    } 
}