Mit einem videoView: UIView
das Video angezeigt wird, und cameraDevice: AVCaptureDevice
scheint folgende für mich zu arbeiten:
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()
}
}
}
Bitte beachte, dass ich die x
und y
Koordinaten tauschen musste, und Neuzuordnung den x
coord von 1 auf 0 anstelle von 0 bis 1 - nicht sicher, warum das der Fall sein sollte, aber es scheint notwendig zu sein, damit es richtig funktioniert (obwohl es ein wenig schwierig ist, es zu testen).
Bearbeiten: Apple's documentation erläutert den Grund für die Koordinatentransformation.
Zusätzlich kann ein Gerät einen Fokuspunkt von Interesse unterstützen. Sie testen mithilfe von focusPointOfInterestSupported auf Unterstützung. Wenn es unterstützt wird, legen Sie den Fokuspunkt mit FocusPointOfInterest fest. Sie übergeben einen CGPoint, wobei {0,0} links oben im Bildbereich steht und {1,1} im Querformat mit der rechten Home-Taste die untere rechte Ecke darstellt. Dies gilt auch, wenn sich das Gerät im Hochformat befindet .
In meinem Beispiel, das ich hatte mit .ContinuousAutoFocus
und .ContinuousAutoExposure
, aber die Dokumentation zeigt .AutoFocus
die richtige Wahl ist. Seltsamerweise erwähnt die Dokumentation .AutoExpose
nicht, aber ich benutze es in meinem Code und es funktioniert gut.
I modifiziert auch mein Beispielcode .focusPointOfInterestSupported
und .exposurePointOfInterestSupported
Tests umfassen - die Dokumentation erwähnt auch die isFocusModeSupported:
und isExposureModeSupported:
Methoden für einen bestimmten Fokus/Belichtungs-Modus zu testen, ob es auf einem bestimmten Gerät es vor der Einstellung vorhanden ist, aber ich Angenommen, das Gerät unterstützt die Point-of-Interest-Modi, dann unterstützt es auch die Auto-Modi. Alles scheint in meiner App gut zu funktionieren.
Was ist es nicht funktioniert? Welche Fehler werden erzeugt? Was ist das erwartete Verhalten? Was ist das tatsächliche Verhalten? –
Ich berühre einen Punkt. und Fokus sollte an diesem Punkt sein. aber es gibt keinen Effekt. Es konzentriert sich nicht auf diesen Punkt. stattdessen ist es immer im Unendlichkeitsfokus. Das ist das Problem. @David – Krishna
Haben Sie es durchlaufen, um sicherzustellen, dass beide Wenns genommen werden? –