2014-11-29 3 views

Antwort

63

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() 
    } 
} 
+1

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

+0

@Awesomeness Ja, ich stimme ... aktualisiert. –

+0

@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. –

6

Wie so:

func turnTorchOn(){ 

    let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) 
    if device.hasTorch { 
     device.lockForConfiguration(nil) 
     device.setTorchModeOnWithLevel(1.0, error: nil) 
     device.unlockForConfiguration() 
    } 


} 
24

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) 
     } 
    } 
+4

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

+0

Es funktionierte, danke :) –

+1

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. –

6

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

genial. Vielen Dank. – Mikrasya

11

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)

3

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

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

Verwandte Themen