J'aimerais ajouter une fonctionnalité de lampe de poche à mon application dans Swift. Comment puis-je m'y prendre?
Mise à jour n ° 1: (torchActive
ne renvoie pas la valeur attendue; peut-être parce que cela a été modified )
Mise à jour n ° 2: pour Swift 2.0
Pour activer ou désactiver le flash (pas seulement "activé" comme dans la réponse de cochon fou), vous pouvez utiliser la méthode suivante:
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)
}
}
}
J'ai utilisé des blocs de capture imbriqués pour implémenter la suggestion d'Awesomeness à partir des commentaires. Ainsi, même si try device.setTorchModeOnWithLevel(1.0)
échoue, le périphérique est correctement déverrouillé pour la configuration.
Mise à jour n ° 3: Pour Swift 4:
(J'ai édité le code un peu à mon goût personnel)
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)
}
}
Réponse originale:
Pour activer ou désactiver le flash (pas seulement "activé" comme dans la réponse de cochon fou), vous pouvez utiliser la méthode suivante:
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()
}
}
J'ai mis à jour l'excellente réponse de @Lyndsey Scott pour 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)
}
}
Réponse de Swift 4 mise à jour:
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")
}
}
Ensuite, pour l'activer ou le désactiver, appelez la fonction et transmettez un booléen vrai ou faux.
toggleTorch(on: true)
of toggleTorch(on: false)
J'ai eu cette réponse de Hacking avec Swift , mais leur exemple comportait une erreur.
Ils ont utilisé AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
mais ceci produit une erreur disant que defaultDevice
n'existe pas Alors je l'ai changé en AVCaptureDevice.default(for: AVMediaType.video)
Pour 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")
}
}
}
Ainsi:
func turnTorchOn(){
let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
if device.hasTorch {
device.lockForConfiguration(nil)
device.setTorchModeOnWithLevel(1.0, error: nil)
device.unlockForConfiguration()
}
}
Pour xcode 9.1, Swift 4 (mis à jour pour ne pas planter s'il n'y a pas de flambeau):
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)
}
}
}
}
Solution pour Swift 4 avec la condition torch est disponible ou non
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")
}
}
La solution est une combinaison de @Joshua Dance et @Lance
Swift 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)
}
}
}