如何快速打开和closures手电筒?

我想在Swift中将手电function添加到我的应用程序中。 我怎么能这样做呢?

更新#1 🙁 torchActive没有返回期望的值,也许是因为它已被修改 )

更新#2:对于Swift 2.0

要将闪光灯从开启切换到closures状态(不是像疯猪的答案那样“开启”),您可以使用以下方法:

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

我使用了嵌套的do-catch块来从注释中实现Awesomeness的build议。 这样,即使try device.setTorchModeOnWithLevel(1.0)失败,设备正确解锁configuration。


原始答案:

要将闪光灯从开启切换到closures状态(不是像疯猪的答案那样“开启”),您可以使用以下方法:

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

我更新了@Lyndsey Scott对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) } } 

像这样:

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

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

更新了Swift 4答案:

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

然后实际打开或closures它,调用函数并传入true或false布尔值。

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

我从Swift Hacking中得到了这个答案,但是他们的例子中有一个错误。

他们使用AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)但这会产生一个错误,说defaultDevice不存在。 所以我把它改为AVCaptureDevice.default(for: AVMediaType.video)

对于xcode 9.1,swift 4(更新到不崩溃,如果没有火炬):

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