11

1 つのボタンで懐中電灯をオンにし、別のボタンでオフにすることができます。でもボタン一つでやりたい。ただし、bool isSelected メソッドを使用できるフレームワークがありません。そのため、両方の機能を 1 つのボタンに統合する方法についてはまったくわかりません。

動作するコードは次のとおりです。

-(void)onButtonPressed 
{

AVCaptureDevice *flashLight = [AVCaptureDevice 
defaultDeviceWithMediaType:AVMediaTypeVideo];
if([flashLight isTorchAvailable] && [flashLight
isTorchModeSupported:AVCaptureTorchModeOn])
{
    BOOL success = [flashLight lockForConfiguration:nil];
    if(success){
        [flashLight setTorchMode:AVCaptureTorchModeOn];
        [flashLight unlockForConfiguration];
    }
}

}

懐中電灯を消すのに使っています。

-(void)offButtonPressed {

AVCaptureDevice *flashLight = [AVCaptureDevice
defaultDeviceWithMediaType:AVMediaTypeVideo];
if([flashLight isTorchAvailable] && [flashLight
isTorchModeSupported:AVCaptureTorchModeOn])
{
    BOOL success = [flashLight lockForConfiguration:nil];
    if(success){
        [flashLight setTorchMode:AVCaptureTorchModeOff];
        [flashLight unlockForConfiguration];
    }
}


}

作り方にこだわりはありません。懐中電灯が最初のタップで点灯し、2 回目のタップで消灯する限り、その方法はあまり気にしませんでした。

ただし、プログラムで作成した barbuttonitems を使用しているため、IBAction メソッドを提供しないでください。また、提案された方法ができるだけ単純であればありがたいのですが、現在懐中電灯を使用している方法は複雑すぎると思います。

4

7 に答える 7

30

この機能をアプリに実装しました。あなたの質問に答えて、1 つの方法で両方の機能をマージする方法を次に示します。

- (void) flashlight
{
    AVCaptureDevice *flashLight = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    if ([flashLight isTorchAvailable] && [flashLight isTorchModeSupported:AVCaptureTorchModeOn])
    {
        BOOL success = [flashLight lockForConfiguration:nil];
        if (success) 
        {
            if ([flashLight isTorchActive]) {
                [flashLight setTorchMode:AVCaptureTorchModeOff];
            } else {
                [flashLight setTorchMode:AVCaptureTorchModeOn];
            }
            [flashLight unlockForConfiguration];
        }
    }
}
于 2013-02-06T22:57:36.697 に答える
6

スイフト3の場合

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

}

于 2016-12-07T00:02:27.520 に答える
0

ここでコメントを外して、これは私が考えていたことです:

.h

@property (nonatomic) int flashlightState;

.m

-(void) viewDidLoad:
{
    //Any previous code that you may have
    flashlightState = 0;
}
-(void) flashlightStateControl:
{

    if (flashlightState == 1)
    {
        offButtonPress();
        flashlightState = 0;
    }
    else
    {
        onButtonPress();
        flashlightState = 1;
    }
}

これまで呼び出してきたものの代わりに、 を呼び出すという考えですflashlightStateControl()。それはあなたが望んでいたことをするはずです、あなたはそれの一部を微調整することを歓迎します(必要になるかもしれません)が、それはコード形式の一般的な考えです. それがうまくいくことを願っています!

于 2012-07-30T18:05:03.387 に答える
0
- (IBAction)flash:(UIButton *)sender;
{
    Class captureDeviceClass = NSClassFromString(@"AVCaptureDevice");
    if (captureDeviceClass != nil) {
        AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
        if ([device hasTorch] && [device hasFlash]){

            [device lockForConfiguration:nil];
            if (device.torchMode == AVCaptureTorchModeOff) {
                [device setTorchMode:AVCaptureTorchModeOn];
                [device setFlashMode:AVCaptureFlashModeOn];
                //TorchIsOn = YES;

                [self.flashton setHighlighted:YES];
            } else {
                [device setTorchMode:AVCaptureTorchModeOff];
                [device setFlashMode:AVCaptureFlashModeOff];
                //TorchIsOn = NO;

                [self.flashton setHighlighted:NO];
            }
            [device unlockForConfiguration];
        }
    }
}
于 2013-10-19T01:16:55.853 に答える
0

Chuy47の回答に基づくSwift 5のソリューション:

import Foundation
import AVFoundation

extension AVCaptureDevice {

    /// toggles the device's flashlight, if possible
    static func toggleFlashlight() {
        guard let device = AVCaptureDevice.default(for: AVMediaType.video), device.hasTorch else { return }
        do {
            try device.lockForConfiguration()
            let torchOn = !device.isTorchActive
            try device.setTorchModeOn(level: 1.0)
            device.torchMode = torchOn ? .on : .off
            device.unlockForConfiguration()
        } catch {
            print("Error toggling Flashlight: \(error)")
        }
    }
}
于 2019-07-17T14:19:41.500 に答える