Ich möchte meine App in Swift Taschenlampe Funktionalität hinzufügen. Wie kann ich das tun?Wie schaltet man Taschenlampe schnell ein und aus?
Antwort
Update # 1: (torchActive
nicht den erwarteten Wert zurückkehrt, vielleicht, weil es modified gewesen)
Update # 2: für Swift 2.0
Um den Blitz von ein auf aus umzuschalten (nicht nur "on" wie in der Antwort von mad pig), können Sie die folgende Methode verwenden:
Ich habe verschachtelte Do-Catch-Blöcke verwendet, um den Vorschlag von Awesomeness aus den Kommentaren zu implementieren. Auch wenn try device.setTorchModeOnWithLevel(1.0)
fehlschlägt, ist das Gerät für die Konfiguration ordnungsgemäß entsperrt.
Ursprüngliche Antwort:
den Blitz Umschalten von Ein auf Aus (nicht nur "auf", wie in der Antwort ist verrückt Schwein), können Sie die folgende Methode verwenden:
func toggleFlash() {
let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
if (device.hasTorch) {
device.lockForConfiguration(nil)
let torchOn = !device.torchActive
device.setTorchModeOnWithLevel(1.0, error: nil)
device.torchMode = torchOn ? AVCaptureTorchMode.On : AVCaptureTorchMode.Off
device.unlockForConfiguration()
}
}
Wie so:
func turnTorchOn(){
let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
if device.hasTorch {
device.lockForConfiguration(nil)
device.setTorchModeOnWithLevel(1.0, error: nil)
device.unlockForConfiguration()
}
}
I habe für Swift @Lyndsey Scotts große Antwort aktualisiert 2,0
let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
if (device.hasTorch) {
do {
try device.lockForConfiguration()
if (device.torchMode == AVCaptureTorchMode.On) {
device.torchMode = AVCaptureTorchMode.Off
} else {
try device.setTorchModeOnWithLevel(1.0)
}
device.unlockForConfiguration()
} catch {
print(error)
}
}
Für Neulinge (wie mich) möchte ich hinzufügen, dass Sie "Import AVFoundation" oben in der View-Controller-Swift-Datei enthalten müssen. – dmcknight
Es funktionierte, danke :) –
FYI Ich aktualisierte meine Antwort für Swift 2.0 auch (die Antwort, die diese basierte) vor ein paar Monaten und im Gegensatz zu dieser Antwort, behandelt meine Antwort auch den Fall, wo try device.setTorchModeOnWithLevel (1.0) schlägt fehl. –
für schnelle 3
func toggleFlash() {
if let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo), device.hasTorch {
do {
try device.lockForConfiguration()
let torchOn = !device.isTorchActive
try device.setTorchModeOnWithLevel(1.0)
device.torchMode = torchOn ? .on : .off
device.unlockForConfiguration()
} catch {
print("error")
}
}
}
genial. Vielen Dank. – Mikrasya
Aktualisiert Swift 4 Antwort:
func toggleTorch(on: Bool) {
guard let device = AVCaptureDevice.default(for: AVMediaType.video)
else {return}
if device.hasTorch {
do {
try device.lockForConfiguration()
if on == true {
device.torchMode = .on
} else {
device.torchMode = .off
}
device.unlockForConfiguration()
} catch {
print("Torch could not be used")
}
} else {
print("Torch is not available")
}
}
Dann es tatsächlich zu aktivieren oder zu deaktivieren, die Funktion aufrufen und in einem wahr oder falsch boolean passieren.
toggleTorch(on: true)
von toggleTorch(on: false)
bekam ich diese Antwort von Hacking with Swift, aber ihr Beispiel darin einen Fehler hatte.
Sie verwendeten AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
, aber dies erzeugt einen Fehler, defaultDevice
nicht existiert. So habe ich es zu AVCaptureDevice.default(for: AVMediaType.video)
Für Xcode 9.1, schnelle 4 (aktualisiert nicht abstürzen, wenn kein Brenner):
func toggleFlash() {
let device = AVCaptureDevice.default(for: AVMediaType.video)
if (device != nil) {
if (device!.hasTorch) {
do {
try device!.lockForConfiguration()
if (device!.torchMode == AVCaptureDevice.TorchMode.on) {
device!.torchMode = AVCaptureDevice.TorchMode.off
} else {
do {
try device!.setTorchModeOn(level: 1.0)
} catch {
print(error)
}
}
device!.unlockForConfiguration()
} catch {
print(error)
}
}
}
}
Lösung für Swift 4 Mit Bedingung Fackel verfügbar ist oder nicht
func flashlight() {
guard let device = AVCaptureDevice.default(for: AVMediaType.video) else{
return
}
if (device.hasTorch) {
do {
try device.lockForConfiguration()
if (device.torchMode == .on) {
device.torchMode = .off
} else {
device.torchMode = .on
}
device.unlockForConfiguration()
} catch {
print("Torch could not be used")
print(error)
}
}
else{
print("Torch is not available")
}
}
Die Lösung ist eine Kombination aus @Joshua Dance Und @Lance
Ich denke, der 'setTourchModeOnWithLevel'-Aufruf muss in einem eigenen try-Block sein, damit er das Gerät für die Konfiguration entsperren kann, falls etwas schief geht.do ' { versuchen device.setTorchModeOnWithLevel (1,0) } catch { device.unlockForConfiguration() } ' – Awesomeness
@Awesomeness Ja, ich stimme ... aktualisiert. –
@Awesomeness Ich habe Ihren Vorschlag implementiert, aber stattdessen einen verschachtelten do-catch-Block verwendet, da er eine Zeile weniger Code enthält ... Kein Aufruf von device.unlockForConfiguration() innerhalb und außerhalb des setTorchModeOnWithLevel (1.0) catch-Blocks. –