【问题标题】:How do you set a device's flash mode in Swift 4?如何在 Swift 4 中设置设备的 flash 模式?
【发布时间】:2017-11-13 21:10:25
【问题描述】:

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

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 会出现警告“'flashMode' 在 iOS 10.0 中已弃用:请改用 AVCapturePhotoSettings.flashMode。”。尽管这只是一个警告,但在测试我的应用程序时它并没有启用闪光灯,所以我将该行更改为:

device.flashMode = AVCaptureDevice.FlashMode.auto

所以我设置了这条线,就像它所暗示的那样:

AVCapturePhotoSettings.flashMode = AVCaptureDevice.FlashMode.auto

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

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

【问题讨论】:

  • 如果您想制作“手电筒”(英国为“手电筒”),请使用torchMode。如果您将相机闪光灯设置为拍照,请根据需要使用AVCapturePhotoOutputAVCapturePhotoSettings 设置,而不是使用AVCaptureDevice
  • 这就是我的想法,但我得到“'AVCapturePhotoSettings' 类型的值没有成员'AVCapturePhotoOutput'”。我在拍照时用它来关闭闪光灯。
  • AVCapturePhotoOutput的文档开始。
  • 我在我的应用程序中经常使用 AVCapturePhotoSettings,但我没有在文档中找到关于如何在拍照时启用闪光灯的线索。 developer.apple.com/documentation/avfoundation/…它实际上在哪里显示了启用它的示例?
  • 我试过settings.flashMode = AVCaptureDevice.FlashMode.on没有错误,但是没有flash。

标签: ios swift camera


【解决方案1】:

我也遇到了同样的问题。不幸的是,许多有用的方法在 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)
}

希望它会有所帮助。

【讨论】:

  • 是的!这使它变得如此容易,所以我欢迎改变。我只是还没有看到它记录太多。
【解决方案2】:

对于目标 C:

- (IBAction)turnTorchOn: (UIButton *) sender {
    sender.selected = !sender.selected;
    BOOL on;
    if (sender.selected) {
        on = true;
    } else {
        on = false;
    }
    // check if flashlight available
    Class captureDeviceClass = NSClassFromString(@"AVCaptureDevice");
    if (captureDeviceClass != nil) {
        AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
        AVCapturePhotoSettings *photosettings = [AVCapturePhotoSettings photoSettings];
        if ([device hasTorch] && [device hasFlash]) {
            [device lockForConfiguration:nil];
            if (on) {
                [device setTorchMode:AVCaptureTorchModeOn];
                photosettings.flashMode = AVCaptureFlashModeOn;
                //torchIsOn = YES; //define as a variable/property if you need to know status
            } else {
                [device setTorchMode:AVCaptureTorchModeOff];
                 photosettings.flashMode = AVCaptureFlashModeOn;
                //torchIsOn = NO;
            }
            [device unlockForConfiguration];
        }
    }
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 2018-10-30
    • 2020-04-14
    • 2014-10-28
    • 2017-04-22
    • 2018-12-22
    相关资源
    最近更新 更多