wake-up-neo.com

Wie kann man die Taschenlampe schnell ein- und ausschalten?

Ich möchte meiner App in Swift eine Taschenlampenfunktion hinzufügen. Wie kann ich das machen?

38
Lachtan

Update # 1: (torchActive gibt den erwarteten Wert nicht zurück; möglicherweise, weil er modified ist)

Update # 2: Für Swift 2.0

Um den Blitz von Ein zu Aus umzuschalten (nicht nur "Ein" wie in der Antwort von Mad Pig), können Sie die folgende Methode verwenden:

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

Ich habe verschachtelte Do-Catch-Blöcke verwendet, um den Kommentar von Awesomeness aus den Kommentaren zu implementieren. Auf diese Weise wird das Gerät auch für den Fall, dass try device.setTorchModeOnWithLevel(1.0) ausfällt, zur Konfiguration ordnungsgemäß entsperrt.

Update 3: Für Swift 4:

(Ich habe den Code ein bisschen nach meinem persönlichen Geschmack bearbeitet)

func toggleFlash() {
    guard let device = AVCaptureDevice.default(for: AVMediaType.video) else { return }
    guard device.hasTorch else { return }

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

Ursprüngliche Antwort:

Um den Blitz von Ein zu Aus umzuschalten (nicht nur "Ein" wie in der Antwort von Mad Pig), 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()
    }
}
81
Lyndsey Scott

Ich habe @Lyndsey Scotts großartige Antwort auf Swift 2.0 aktualisiert

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)
        }
    }
25
gpichler

Antwort für Swift 4 aktualisiert:

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

Um es tatsächlich ein- oder auszuschalten, rufen Sie die Funktion auf und übergeben Sie ein wahres oder falsches Boolean. 

toggleTorch(on: true) von toggleTorch(on: false)

Ich habe diese Antwort von Hacking with Swift erhalten, jedoch hatte ihr Beispiel einen Fehler. 

Sie verwendeten AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo), was jedoch zu einer Fehlermeldung führt, dass defaultDevice nicht vorhanden ist. Also änderte ich es zu AVCaptureDevice.default(for: AVMediaType.video)

24
Joshua Dance

Für Swift 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")
        }
    }
}
7
Chuy47

So wie:

 func turnTorchOn(){

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


}
6
mad pig

Für xcode 9.1, Swift 4 (aktualisiert, um nicht zu stürzen, wenn keine Taschenlampe vorhanden ist)

   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)
            }
        }
    }
}
5
Lance

Lösung für Swift 4 mit Bedingung torch ist verfügbar 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 die Kombination von @Joshua Dance And @Lance

3
Anup Gupta

Schnell 4.2

if let device = AVCaptureDevice.default(for: AVMediaType.video) {

    if (device.hasTorch) {
        do {
            try device.lockForConfiguration()
            let torchOn = !device.isTorchActive
            try device.setTorchModeOn(level: 1.0)
            device.torchMode = torchOn ? AVCaptureDevice.TorchMode.on : AVCaptureDevice.TorchMode.off
            device.unlockForConfiguration()
        } catch {
            print(error.localizedDescription)
        }
    }
}
0