IOS 7.1 imagePicker CameraFlashMode без указания состояния вспышки

У меня есть приложение для iPhone, которое накладывает камеру на пользовательский вид. У меня есть кнопка для переключения между режимами вспышки камеры, это код

switch ([self.imagePickerController cameraFlashMode]) {
    case UIImagePickerControllerCameraFlashModeAuto:
        [self.imagePickerController setCameraFlashMode:UIImagePickerControllerCameraFlashModeOn];
        return @"On";
        break;

    case UIImagePickerControllerCameraFlashModeOn:
        [self.imagePickerController setCameraFlashMode:UIImagePickerControllerCameraFlashModeOff];
        return @"Off";
        break;

    case UIImagePickerControllerCameraFlashModeOff:
        [self.imagePickerController setCameraFlashMode:UIImagePickerControllerCameraFlashModeAuto];
        return @"Auto";
        break;

    default:
        break;
}

Это моя проблема: отлично работает на iOS 7.0x, но в iOS 7.1 свойство cameraFlashMode возвращает UIImagePickerControllerCameraFlashModeAuto независимо от его реального состояния.

Режим вспышки меняется, но я не вижу этого. Любые подсказки? Благодаря

Ответ 1

Я решил это так:

@property (nonatomic) NSInteger flashMode;

if (_flashMode == UIImagePickerControllerCameraFlashModeAuto)
{
    _flashMode = UIImagePickerControllerCameraFlashModeOff;
}
else if (_flashMode == UIImagePickerControllerCameraFlashModeOff)
{
    _flashMode = UIImagePickerControllerCameraFlashModeOn;
}
else if (_flashMode == UIImagePickerControllerCameraFlashModeOn)
{
    _flashMode = UIImagePickerControllerCameraFlashModeAuto;
}

_cameraPicker.cameraFlashMode = (UIImagePickerControllerCameraFlashMode)_flashMode;

Ответ 2

Хорошо, поэтому я подробно изучил это и наткнулся на эту полезную статью в Интернете:

http://www.c2itconsulting.com/2013/10/ios-flash-setting-on-camera-picker-only-available-after-view-is-displayed/

Я принял их совет, и теперь я установил настройку вспышки непосредственно перед тем, как пользователь сделает снимок. Вместо того, чтобы проверять, что такое текущая настройка вспышки камеры, все, что я делаю, это проверить текст моей flash-кнопки titleLabel, чтобы узнать, чего хочет пользователь в качестве настройки вспышки:

Вот код, который я придумал, и теперь он идеально подходит для меня. Надеюсь, это поможет всем вам с той же проблемой, которой не было в iOS 7.0, но теперь она работает на iOS 7.1.

#define deviceHasCameraFlash [UIImagePickerController isFlashAvailableForCameraDevice:UIImagePickerControllerCameraDeviceRear]

- (void)capturePhoto
{
    if (self.cameraDevice != UIImagePickerControllerCameraDeviceFront && deviceHasCameraFlash)
    {
        if ([self.flashButton.titleLabel.text isEqualToString:@"Auto"])
        {
            self.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto;
        }
        else if ([self.flashButton.titleLabel.text isEqualToString:@"Off"])
        {
            self.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff;
        }
        else if ([self.flashButton.titleLabel.text isEqualToString:@"On"])
        {
            self.cameraFlashMode = UIImagePickerControllerCameraFlashModeOn;
        }
    }

   [self takePicture];
}

Ответ 3

Попробуйте использовать AVCaptureDevice:

    Class captureDeviceClass = NSClassFromString(@"AVCaptureDevice");

    if (captureDeviceClass != nil) {
        AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

        [device lockForConfiguration:nil];

        if ([device hasTorch]) {
          if (device.torchMode ==  AVCaptureTorchModeAuto) {
            NSLog(@"Auto");
          }
          if (device.torchMode ==  AVCaptureTorchModeOn) {
            NSLog(@"On");
          }
          if (device.torchMode ==  AVCaptureTorchModeOff) {
            NSLog(@"Of");
          }
        }

        if ([device hasFlash]) {
          if (device.flashMode ==  AVCaptureFlashModeAuto) {
            NSLog(@"Auto");
          }
          if (device.flashMode ==  AVCaptureFlashModeOn) {
            NSLog(@"On");
          }
          if (device.flashMode ==  AVCaptureFlashModeOff) {
            NSLog(@"Of");
          }
        }
        [device unlockForConfiguration];
    }

Ответ 4

Ответ выше не работал у меня в iOS 7.1 @daidai, это то, что я сделал, и это сработало для меня.

В вашем .h файле свойство flashMode

- (void)didTapFlash:(id)sender
{



    if (self.flashMode == UIImagePickerControllerCameraFlashModeAuto) {
        //toggle your button to "on"
        [self.imagePicker setCameraFlashMode:UIImagePickerControllerCameraFlashModeOn];
        [self.flashButton setImage:[UIImage imageNamed:@"flashOn"] forState:UIControlStateNormal];
         self.flashMode = UIImagePickerControllerCameraFlashModeOn;

        NSLog(@"On state: %d", self.flashMode);
    }else if (self.flashMode == UIImagePickerControllerCameraFlashModeOn){
        //toggle your button to "Off"
        [self.imagePicker setCameraFlashMode:UIImagePickerControllerCameraFlashModeOff];
        [self.flashButton setImage:[UIImage imageNamed:@"flashOf"] forState:UIControlStateNormal];
        self.flashMode = UIImagePickerControllerCameraFlashModeOff;

        NSLog(@"Of state: %d", self.flashMode);
    }else if (self.flashMode == UIImagePickerControllerCameraFlashModeOff){
        //toggle your button to "Auto"
        [self.imagePicker setCameraFlashMode:UIImagePickerControllerCameraFlashModeAuto];
        [self.flashButton setImage:[UIImage imageNamed:@"flashAuto"] forState:UIControlStateNormal];
         self.flashMode = UIImagePickerControllerCameraFlashModeAuto;

        NSLog(@"Auto state: %d", self.flashMode);
    }
}