Con un videoView: UIView
visualizzazione del video e cameraDevice: AVCaptureDevice
, il seguente sembra funzionare per me:
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()
}
}
}
Nota che ho dovuto scambiare le x
e y
coordinate, e rimappare il x
coord 1-0 invece di 0 a 1 - non sono sicuro del motivo, ma sembra che sia necessario farlo funzionare correttamente (anche se è un po 'complicato testarlo).
Modifica: Apple's documentation spiega il motivo della trasformazione delle coordinate.
Inoltre, un dispositivo può supportare un punto AF di interesse. Testare il supporto utilizzando focusPointOfInterestSupported. Se è supportato, si imposta il punto focale usando focusPointOfInterest. Si passa un CGPoint dove {0,0} rappresenta la parte in alto a sinistra dell'area dell'immagine e {1,1} rappresenta la parte in basso a destra in modalità orizzontale con il pulsante home sulla destra: questo si applica anche se il dispositivo è in modalità verticale .
Nel mio esempio avevo usato .ContinuousAutoFocus
e .ContinuousAutoExposure
, ma la documentazione indica .AutoFocus
è la scelta giusta. Stranamente la documentazione non fa menzione di .AutoExpose
, ma la sto usando nel mio codice e funziona perfettamente.
ho anche modificato il mio codice di esempio per includere .focusPointOfInterestSupported
e .exposurePointOfInterestSupported
test - la documentazione menziona anche utilizzando i metodi isFocusModeSupported:
e isExposureModeSupported:
per una data modalità di messa a fuoco/esposizione per verificare se è disponibile su un dato dispositivo prima di esso, ma io supponiamo che il dispositivo supporti le modalità punto di interesse, quindi supporta anche le modalità automatiche. Tutto sembra funzionare bene nella mia app.
Che dire non funziona? Quali errori vengono prodotti? Qual è il comportamento previsto? Qual è il comportamento reale? –
tocco in un punto. e la messa a fuoco dovrebbe essere a quel punto. ma non c'è alcun effetto. non si sta concentrando su quel punto. invece è sempre nella messa a fuoco all'infinito. Questo è il problema. @ David – Krishna
Avete camminato attraverso di esso per assicurare se entrambi sono presi? –