Cambiar el modo de flash con una superposition de camera personalizada

Estoy usando el UIImagePickerController con una vista de superposition de camera personalizada y deseo agregar un button personalizado para alternar el modo de flash entre auto, on y off. Aquí está el método que llama el button:

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

El problema es que esto no funciona. El valor de self.imagePickerController.cameraFlashMode nunca cambia una vez que se presenta el controller. El valor del flash se puede cambiar antes de que se presente pero, una vez que lo sea, siempre devolverá un valor de 0 (Auto). La parte extraña es que, aunque el valor no cambia, el flash se comporta como si lo hiciera si cambio el código anterior a:

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

Todo funciona como se esperaba. (el flashButton.tag simplemente almacena el valor del flash)

¿Alguien sabe lo que está sucediendo aquí? ¿Por qué el valor de cameraFlashMode siempre es 0 (tanto en las instrucciones NSLog como cuando se verifica directamente a través del depurador) aunque el flash se está comportando como si estuviera configurado correctamente?

Parece ser un error en la última versión de iOS,

notarás que funcionará habilitando la bandera de

  self.picker.showsCameraControls = true 

pero muestra el control nativo de la camera a su overlayview, así que lo hacké con este código:

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

Es lo suficientemente rápido como para no molestar al usuario con los controles de mostrar y ocultar. ¡Funcionó para mí y estoy seguro de que también funcionará en su caso!