2014-11-29 15 views

Odpowiedz

63

Aktualizacja # 1: (torchActive nie zwraca wartość oczekiwaną, być może dlatego, że było modified)

Aktualizacja # 2: Dla Swift 2.0

Aby przełączyć lampę błyskową z położenia na wyłączony (nie tylko "włączony" jak w odpowiedzi na szaloną świnię), można użyć następującej metody:

func toggleFlash() { 
    let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) 
    if (device.hasTorch) { 
     do { 
      try device.lockForConfiguration() 
      if (device.torchMode == AVCaptureTorchMode.On) { 
       device.torchMode = AVCaptureTorchMode.Off 
      } else { 
       do { 
        try device.setTorchModeOnWithLevel(1.0) 
       } catch { 
        print(error) 
       } 
      } 
      device.unlockForConfiguration() 
     } catch { 
      print(error) 
     } 
    } 
} 

Użyłem zagnieżdżonych bloków catch-do do realizacji sugestii Awesomeness z komentarzy. W ten sposób, nawet jeśli try device.setTorchModeOnWithLevel(1.0) ulegnie awarii, urządzenie zostanie poprawnie odblokowane w celu konfiguracji.


Oryginalny odpowiedź:

Aby włączyć lampę błyskową z włączenia na wyłączenie (nie tylko „na”, jak w odpowiedzi szalonego świni), można użyć następującej metody:

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

Myślę, że wywołanie 'setTourchModeOnWithLevel' musi być w swoim własnym bloku try, aby mógł odblokować urządzenie w celu konfiguracji w przypadku, gdyby coś poszło nie tak. ' zrobić { spróbować device.setTorchModeOnWithLevel (1.0) } catch { device.unlockForConfiguration() } ' – Awesomeness

+0

@Awesomeness Tak, zgadzam się ... zaktualizuje. –

+0

@Awesomeness Zaimplementowałem twoją sugestię, ale użyłem zagnieżdżonego bloku "do-catch", ponieważ jest to jeden mniejszy wiersz kodu ... Nie ma potrzeby wywoływania device.unlockForConfiguration() zarówno w bloku blokującym setTorchModeOnWithLevel (1.0), jak i poza nim. –

6

tak:

func turnTorchOn(){ 

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


} 
24

I już aktualizowany wielką odpowiedź @Lyndsey Scotta dla Swift 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

Dla początkujących (jak ja), chciałbym dodać, że musisz dodać "import AVFoundation" w górnej części pliku Swift kontrolera widoku. – dmcknight

+0

To zadziałało, dziękuję :) –

+1

FYI Zaktualizowałem również swoją odpowiedź dla Swift 2.0 (odpowiedź na której opierał się) kilka miesięcy temu iw przeciwieństwie do tej odpowiedzi, moja odpowiedź zajmuje się również przypadkiem, w którym wypróbowano urządzenie.setTorchModeOnWithLevel (1.0) zawiedzie. –

6

dla szybkiej 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

niesamowite. dzięki. – Mikrasya

11

Updated Swift 4 Odpowiedź:

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

Wtedy faktycznie je włączyć lub wyłączyć, należy wywołać funkcję i przechodzą w prawdziwą lub fałszywą logiczną.

toggleTorch(on: true) z toggleTorch(on: false)

dostałem taką odpowiedź od Hacking with Swift, jednak ich przykładem miałem błąd w nim.

Użyto AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo), ale powoduje to błąd informujący, że defaultDevice nie istnieje. Więc zmieniłem go AVCaptureDevice.default(for: AVMediaType.video)

3

Dla Xcode 9.1, Swift 4 (aktualizacja nie upaść, jeśli nie latarka):

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

rozwiązanie dla Swift 4 z Warunkiem latarka jest dostępna lub nie

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

Rozwiązanie to Kombinacja @Joshua Dance I @Lance

Powiązane problemy