Как включить или выключить фонарик с помощью одной кнопки?

Я могу включить фонарик с помощью одной кнопки и выключить его с помощью другого. Но я хочу сделать это только с одной кнопкой. Однако у меня нет рамки, которая позволяет мне использовать метод bool isSelected. Поэтому я совершенно не знаю, как объединить обе функции вместе одной кнопкой.

Вот код, который работает:

-(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];
    }
}


}

Я не особо отношусь к тому, как это делается. Пока фонарик включается с первым краном и отключается на втором, мне все равно, о методе.

Однако я использую barbuttonitems, сделанные программно, поэтому, пожалуйста, не давайте мне методы IBAction. Я также был бы признателен, если бы предложенный метод был максимально простым, я думаю, что способ использования фонарика сейчас слишком сложный.

Ответ 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];
        }
    }
}

Ответ 2

Для быстрого 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")
    }
}

}

Ответ 3

Проблема:


Включите и выключите фонарик на мобильном устройстве (поддерживаемый iOS) с помощью одной кнопки.

Решение:

  • Создайте кнопку на контроллере просмотра.
  • Установите действие кнопки и добавьте цель как я.

ПРИМЕЧАНИЕ. Установите тег как 101 в построителе интерфейса перед его исполнением, это приведет к тому, что значение тега будет равно 101.

Ниже приведен код, который должен быть записан в методе действий в файле ViewController.m


- (IBAction)flashLightButtonTapped:(id)sender
{

    UIButton *button = sender;
    AVCaptureDevice *flashLight = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    if (button.tag==101)
    {

        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];
            }
        }
        button.tag=102;
    }
    else if (button.tag==102)
    {
        if ([flashLight isTorchAvailable] && [flashLight isTorchModeSupported:AVCaptureTorchModeOn])
        {
            BOOL success = [flashLight lockForConfiguration:nil];
            if (success)
            {
                if ([flashLight isTorchActive])
                {
                    [flashLight setTorchMode:AVCaptureTorchModeOn];
                }
                else
                {
                    [flashLight setTorchMode:AVCaptureTorchModeOff];

                }
                [flashLight unlockForConfiguration];
            }
        }
        button.tag=101;
    }

}

Ответ 4

Отключение комментариев здесь, вот что я думал:

.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(). Это должно делать то, что вы хотели, вы более чем можете настроить его части (вам может понадобиться), но это общая идея в кодовой форме. Надеюсь, что это сработает для вас!

Ответ 5

- (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];
        }
    }
}

Ответ 6

Решение для Swift 5 на основе ответа Chuy47:

import Foundation
import AVFoundation

extension AVCaptureDevice {

    /// toggles the device 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 turning on Flashlight: \(error)")
        }
    }
}