Изменение режима вспышки с пользовательским наложением камеры

Я использую UIImagePickerController с пользовательским видом наложения камеры и хочу добавить пользовательскую кнопку для переключения режима вспышки между авто, вкл и выкл. Вот метод, который вызывает кнопка:

- (void)didTapFlash:(id)sender { if (self.imagePickerController.cameraFlashMode == UIImagePickerControllerCameraFlashModeAuto) { [imagePickerController setCameraFlashMode:UIImagePickerControllerCameraFlashModeOn]; [self.flashButton setImage:[UIImage imageNamed:@"flashIconOn.png"] forState:UIControlStateNormal]; } else if (self.imagePickerController.cameraFlashMode == UIImagePickerControllerCameraFlashModeOn) { self.imagePickerController.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff; [self.flashButton setImage:[UIImage imageNamed:@"flashIconOff.png"] forState:UIControlStateNormal]; } else if (self.imagePickerController.cameraFlashMode == UIImagePickerControllerCameraFlashModeOff) { self.imagePickerController.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto; [self.flashButton setImage:[UIImage imageNamed:@"flashIconAuto.png"] forState:UIControlStateNormal]; } } 

Проблема в том, что это не работает. Значение self.imagePickerController.cameraFlashMode никогда не изменяется после представления контроллера. Значение флэш-памяти можно изменить до того, как оно будет представлено, но, как только оно появится, оно всегда будет возвращать значение 0 (Авто). Странная часть, хотя значение не меняется, вспышка ведет себя так, как если бы она делала это, если я изменил код выше:

 - (void)didTapFlash:(id)sender { if (flashButton.tag == 0) { [imagePickerController setCameraFlashMode:UIImagePickerControllerCameraFlashModeOn]; self.flashButton.tag = 1; [self.flashButton setImage:[UIImage imageNamed:@"flashIconOn.png"] forState:UIControlStateNormal]; } else if (flashButton.tag == 1) { self.imagePickerController.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff; self.flashButton.tag = -1; [self.flashButton setImage:[UIImage imageNamed:@"flashIconOff.png"] forState:UIControlStateNormal]; } else if (flashButton.tag == -1) { self.imagePickerController.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto; self.flashButton.tag = 0; [self.flashButton setImage:[UIImage imageNamed:@"flashIconAuto.png"] forState:UIControlStateNormal]; } } 

Все работает так, как ожидалось. (flashButton.tag просто сохраняет значение вспышки)

Кто-нибудь знает, что здесь происходит? Почему значение cameraFlashMode всегда равно 0 (как в инструкциях NSLog, так и при проверке непосредственно через отладчик), даже если вспышка ведет себя так, как будто она настроена правильно?

Кажется, это ошибка в последней версии iOS,

вы заметите, что он будет работать с включением флага

  self.picker.showsCameraControls = true 

но он показывает встроенный контроль камеры на ваш overlayview, поэтому я взломал его с помощью этого кода:

  self.picker.showsCameraControls = true self.picker.cameraFlashMode = .On self.picker.showsCameraControls = false 

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

  • Кнопка добавления ставки в путанице приложения
  • iOS SDK: перемещение кнопки в центр экрана по коду
  • Как получить фоновое изображение кнопки в iPhone?
  • Давайте будем гением компьютера.