Chciałbym dodać funkcjonalność latarki do mojej aplikacji w Swift. Jak mogę to zrobić?Jak włączać i wyłączać latarkę?
Odpowiedz
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()
}
}
tak:
func turnTorchOn(){
let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
if device.hasTorch {
device.lockForConfiguration(nil)
device.setTorchModeOnWithLevel(1.0, error: nil)
device.unlockForConfiguration()
}
}
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)
}
}
Dla początkujących (jak ja), chciałbym dodać, że musisz dodać "import AVFoundation" w górnej części pliku Swift kontrolera widoku. – dmcknight
To zadziałało, dziękuję :) –
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. –
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")
}
}
}
niesamowite. dzięki. – Mikrasya
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)
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)
}
}
}
}
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
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
@Awesomeness Tak, zgadzam się ... zaktualizuje. –
@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. –