Как включить или выключить фонарик с помощью одной кнопки?
Я могу включить фонарик с помощью одной кнопки и выключить его с помощью другого. Но я хочу сделать это только с одной кнопкой. Однако у меня нет рамки, которая позволяет мне использовать метод 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)")
}
}
}