我正在调用一个函数来尝试打开设备的闪光灯:

private func flashOn(device:AVCaptureDevice)
{
    print("flashOn called");
    do {

        try device.lockForConfiguration()
        // line below returns warning 'flashMode' was deprecated in iOS 10.0: Use AVCapturePhotoSettings.flashMode instead.
        device.flashMode = AVCaptureDevice.FlashMode.auto
        device.unlockForConfiguration()

    } catch {

        // handle error
        print("flash on error");
    }

}

将device.flashMode设置为AVCaptureDevice.FlashMode.auto会发出警告“iOS 10.0中不推荐使用'flashMode':改为使用AVCapturePhotoSettings.flashMode”。即使只是警告,它也不会在测试我的应用程序时启用闪光灯,因此我将该行更改为:
device.flashMode = AVCaptureDevice.FlashMode.auto

因此,我为此设定了界线,就像它建议的那样:
AVCapturePhotoSettings.flashMode = AVCaptureDevice.FlashMode.auto

我收到错误消息“实例成员'flashMode'不能用于类型'AVCapturePhotoSettings'”

所以我不知道如何使用Swift 4.0在Xcode版本9中设置Flash。我在Stack Overflow中找到的所有答案都是以前的版本。

最佳答案

我一直面临着同样的问题。不幸的是,iOS10和11中弃用了许多有用的方法。这是我设法解决的方法:

AVCapturePhotoSettings对象是唯一的,并且不能重复使用,因此每次使用此方法都需要获取新设置:

/// the current flash mode
private var flashMode: AVCaptureDevice.FlashMode = .auto

/// Get settings
///
/// - Parameters:
///   - camera: the camera
///   - flashMode: the current flash mode
/// - Returns: AVCapturePhotoSettings
private func getSettings(camera: AVCaptureDevice, flashMode: AVCaptureDevice.FlashMode) -> AVCapturePhotoSettings {
    let settings = AVCapturePhotoSettings()

    if camera.hasFlash {
        settings.flashMode = flashMode
    }
    return settings
}

如您所见,不需要lockConfiguration。

然后只需在拍摄照片时使用它:
 @IBAction func captureButtonPressed(_ sender: UIButton) {
    let settings = getSettings(camera: camera, flashMode: flashMode)
    photoOutput.capturePhoto(with: settings, delegate: self)
}

希望它会有所帮助。

10-06 02:55