web-dev-qa-db-ja.com

デバイスのフラッシュモードをSwift 4に設定するにはどうすればよいですか?

デバイスのフラッシュをオンにしようとする関数を呼び出しています。

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に設定すると、「iOS10.0では「flashMode」は非推奨になりました。代わりにAVCapturePhotoSettings.flashModeを使用してください。」という警告が表示されます。これは単なる警告ですが、アプリのテスト時にフラッシュが有効にならないため、その行を次のように変更します。

device.flashMode = AVCaptureDevice.FlashMode.auto

だから私はそれが示唆するように、これに線を設定しました:

AVCapturePhotoSettings.flashMode = AVCaptureDevice.FlashMode.auto

そして、「インスタンスメンバー 'flashMode'はタイプ 'AVCapturePhotoSettings'では使用できません」というエラーが表示されます。

したがって、Swift 4.0を使用してXcodeバージョン9でフラッシュを設定する方法がわかりません。StackOverflowで見つけたすべての答えは、以前のバージョンのものです。

7

私は同じ問題に直面しています。残念ながら、多くの便利なメソッドが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)
}

それが役立つことを願っています。

9
Crunkz

Objective 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];
        }
    }
 }
5
guru