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);
}
}