UIImagePickerController rompe la apariencia de la barra de estado

En mi archivo .plist, tengo ” Ver la apariencia de la barra de estado basada en el controlador ” establecido en NO . Pero después de UIImagePickerController , mi aplicación se comporta como si la opción estuviera establecida en YES .

En mi aplicación, presento un VC que presenta un UIImagePickerController .

El problema ocurre así:

  • Después de que se presenta el selector de fotografías, cuando se selecciona una biblioteca de fotografías, cambia el color del texto de la barra de estado.
  • Luego, una vez que se descarta UIImagePickerController , el espacio de la barra de estado cambia para el rest de mi aplicación y toda la barra de navegación para otros controladores se muestra debajo de la barra de estado.

¿Hay alguna manera de solucionar esto sin administrar la barra de estado en mis controladores de vista?

Ninguna de las soluciones anteriores funcionó para mí, pero al combinar las respuestas de Rich86man y iOS_DEV_09 tengo una solución que funciona constantemente:

 UIImagePickerController* imagePicker = [[UIImagePickerController alloc] init]; imagePicker.delegate = self; 

y

 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { [[UIApplication sharedApplication] setStatusBarHidden:YES]; } 

En cuanto a esta increíble solución. Para 2014 / iOS8 encontré en algunos casos que también prefersStatusBarHidden incluir prefersStatusBarHidden y, posiblemente, childViewControllerForStatusBarHidden So …

 -(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { [[UIApplication sharedApplication] setStatusBarHidden:YES]; } -(BOOL)prefersStatusBarHidden // iOS8 definitely needs this one. checked. { return YES; } -(UIViewController *)childViewControllerForStatusBarHidden { return nil; } -(void)showCamera { self.cameraController = [[UIImagePickerController alloc] init]; self.cameraController.delegate = (id)self; // dpjanes solution! etc... 

Espero que ayude a alguien

Hoy enfrenté este mismo problema. Aquí está mi solución.

En el controlador de vista que llama al selector de imágenes, establézcase como el delegado del selector de imágenes. (Probablemente ya estés haciendo esto)

 UIImagePickerController* imagePicker = [[UIImagePickerController alloc] init]; imagePicker.delegate = self; 

Como UIImagePickerController es un tipo de controlador de navegación, también te estás configurando como el delegado de UINavigationController. Entonces :

 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; } 

Reemplace UIStatusBarStyleLightContent con el estilo que esté buscando.

La respuesta aceptada funcionará si tiene el aspecto ‘Ver la barra de estado basada en el controlador’ establecido en NO en su archivo .plist. Si de hecho necesita controlar la barra de estado en algunos otros controladores de vista y tiene esta opción establecida en SÍ, la otra manera de hacer que UIImagePickerController se comporte correctamente es subclasificándolo

 // .h @interface MYImagePickerController : UIImagePickerController @end // .m @implementation MYImagePickerController - (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; // change this to match your style } @end 

Me enfrenté al mismo problema.

aquí está mi solución. ponga esto en la vista que aparecerá del controlador de vista desde el que está abriendo la vista de selección de imágenes

 -(void) viewWillAppear:(BOOL)animated{ [super viewWillAppear:YES]; [[UIApplication sharedApplication] setStatusBarHidden:YES]; } 

Puedes probar esto Creo que needsStatusBarApperanceUpdate funcionará.

 1 -Set UIViewControllerBasedStatusBarAppearance to NO. 2- Call [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; 3- [self setNeedsStatusBarAppearanceUpdate]; 

Encontré esto para ofrecer un manejo adecuado, hay dos partes.

 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque]; ... 

el UIImagePickerController en sí presenta controladores de vista, por lo que este delegado funciona para todos los presentadores en la stack.

el viewWillAppear asegura que este controlador de vista en sí mismo siempre se reinicia siempre que un controlador de vista presentante lo descarte arriba.

Esto es probablemente un error. Resolví el problema configurando “Ver apariencia de la barra de estado basada en el controlador” en SÍ y en cada controlador de vista pegando en el siguiente código:

 - (BOOL)prefersStatusBarHidden { return YES; } 

Entonces mi aplicación se comporta como se esperaba.

Para ocultar la barra de estado en UIImagePicker:

  (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; } 

y cuando se descarta UIImagePicker para ocultar la barra de estado en el controlador View, use el siguiente código:

 -(void) viewWillAppear:(BOOL)animated{ [super viewWillAppear:YES]; [[UIApplication sharedApplication] setStatusBarHidden:YES]; } 

prueba esto ….

esto funcionará en ambos casos, es decir, si usa presentModalViewController y pushViewController

 UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; 

delegar métodos

 -(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info { [[UIApplication sharedApplication] setStatusBarHidden:YES]; [picker dismissViewControllerAnimated:YES completion:^{}]; } - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { [[UIApplication sharedApplication] setStatusBarHidden:YES]; [picker dismissViewControllerAnimated:YES completion:nil]; } 

Yo tuve el mismo problema. Agregar en la información plist: “Ver la apariencia de la barra de estado basada en el controlador” con el valor “NO”

Ejemplo aquí https://stackoverflow.com/a/19211669

Esta solución funciona para mí.

Ninguna de las soluciones anteriores funcionó para mí.

Presento UIImagePickerController como controlador de vista modal. Después de descartar UIImagePickerController, el estado de la barra de estado era:

 [UIApplication sharedApplication].statusBarOrientation = 0 (UIDeviceOrientationUnknown) [UIApplication sharedApplication].statusBarFrame = { 0, 0, 0, 0} 

La solución que me solucionó el problema fue restablecer statusBarOrientation después de descartar UIImagePickerController:

 UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init]; [self.viewController presentViewController:cameraUI animated:true completion:^(void){ }]; ... [self.viewController dismissViewControllerAnimated:animated completion:^(void){ [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait; }]; 

Este código me ayudó a personalizar el estilo de la barra de estado.

EDITAR: esta solución funciona si “Ver apariencia de la barra de estado basada en el controlador” == SÍ

 @implementation UIImagePickerController (IOS7_StatusBarStyle) -(UIViewController*)childViewControllerForStatusBarStyle { return nil; } -(UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } @end 

Todas las respuestas anteriores están bien y pueden ayudar.

Tuve el mismo problema al tener que administrar la aplicación ejecutada en diferentes versiones de iOS .

 UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init]; if(IS_IOS8_AND_UP) { imagePickerController.modalPresentationStyle = UIModalPresentationFullScreen; } else { imagePickerController.modalPresentationStyle = UIModalPresentationCurrentContext; } imagePickerController.delegate = self; [self presentViewController:imagePickerController animated:YES completion:nil]; 

Luego, en delegado:

 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { /* Cancel button color */ _imagePicker.navigationBar.tintColor =  /* Status bar color */ [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault]; } 

Otra solución más que puede funcionar en algunas situaciones.

 let imagePicker = UIImagePickerController() imagePicker.sourceType = .PhotoLibrary imagePicker.navigationBar.barStyle = .Black 

¿Has intentado llamar a [self setNeedsStatusBarAppearanceUpdate] cuando vuelve a aparecer tu controlador de vista [self setNeedsStatusBarAppearanceUpdate] ?

Intento ocultar la barra de estado en UIImagePickerController en iOS7, pero sigo sin saber cómo hacerlo. yo suelo

 - (void)viewWillAppear:(BOOL)animated { [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; } 

en el ViewController que llama al UIImagePickerController, y establece “Ver la apariencia de la barra de estado basada en el controlador = NO” en el archivo plist. Espero que esto pueda ayudar.

prueba esto :

 UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; 

y en el implemento de protocolo, use esto:

 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { [[UIApplication sharedApplication] setStatusBarHidden:YES]; } 

Esto lo resolvió para mí …

 - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { [[UIApplication sharedApplication] setStatusBarHidden:YES]; [picker dismissViewControllerAnimated:YES completion:nil]; } 

Nada aquí específicamente solucionó el problema en el que estaba teniendo (y tal vez el OP estaba teniendo también), así que pensé que iba a compartir mi respuesta. En lugar de ocultar la barra de estado, que creo que es una solución con errores (me di cuenta de que a veces dejaría mi aplicación en un estado en el que la barra de estado estaba oculta cuando no debería). En su lugar opté por probar y jugar bien con los UIStatusBarStyles .

Cuando el UIImagePickerController tiene su vista presentada, configuro el estilo de la barra de estado por defecto ya que el color de fondo predeterminado es un gris claro.

 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES]; } 

Luego, cuando se UIStatusBarStyleLightContent el selector de imágenes, lo configuro nuevamente en UIStatusBarStyleLightContent .

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { //work [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES]; [self dismissViewControllerAnimated:YES completion:NULL]; } - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { //work [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES]; [self dismissViewControllerAnimated:YES completion:NULL]; } 

En este caso, estamos usando 2 pasos

En el primer paso: agregue en info.plist: “Ver apariencia de la barra de estado basada en el controlador” con el valor “NO”

En el segundo paso: Use / llame este código con delegado de UIImagePickerController

  - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { if([navigationController isKindOfClass:[UIImagePickerController class]]) [[UIApplication sharedApplication] setStatusBarHidden:YES]; } 

En caso de IOS-7 agregue una función más

 - (BOOL)prefersStatusBarHidden { return YES; } 

Todo lo anterior no funcionó para mí. Resolví el problema cambiando el estilo de presentación a:

 imagePickerController.modalPresentationStyle = UIModalPresentationFullScreen; 

A partir de iOS 8.1, parece que finalmente han solucionado este error. Pude eliminar todas las soluciones provisionales que empleé de mi código.

Usando el comportamiento predeterminado de iOS 8 tuve problemas con la barra de estado que aparece cuando la quería oculta.

La solución que encontré fue que, directamente después de llamar a presentPopover desde mi controlador de vista, lo hice:

  [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate) withObject:nil afterDelay:0.01]; 

También tuve que agregar esto a mi controlador de vista principal:

 - (UIViewController *)childViewControllerForStatusBarHidden { return nil; } 

Así que tuve este problema y pude resolverlo simplemente implementando una sola función de delegado. El fondo de mi barra de estado es negro, por lo que UIStatusBarStyle para mi aplicación es .LightContent. Cuando presenté el UIImagePickerController para seleccionar una foto del almacenamiento del dispositivo, la barra de estado estaba bien. Sin embargo, al hacer clic en un directorio como “Camera Roll” o “Favorites”, empujando efectivamente hacia la stack de navegación, la barra de estado desapareció. Al seleccionar una foto, no había ninguna barra de estado; al desechar otro controlador de vista modal, solo estaba presente la batería, lo que indica que el rest de la barra de estado también puede ser negra.

Probé algunas de las otras soluciones, como la extensión de UIImagePickerController, pero en Swift, no puede anular el uso de extensiones. Luego traté de subclavar UIImagePickerController e intenté ocultar su barra de estado en viewWillAppear () y mostrar la barra de estado en viewWillDisappear. Pude ver la barra de estado oculta con una animación .Slide, pero como la barra de estado era invisible al seleccionar un directorio, no pude ver la barra de estado mostrar. Nuevamente, la batería verde regresó con el rest de la barra de estado invisible al descartar un controlador de vista modal. También intenté reemplazar prefersStatusBarHidden (), pero esa función nunca se llamó, así que intenté llamar a setNeedsStatusBarAppearanceUpdate () para asegurar que prefersStatusBarHidden () es llamado por el sistema, pero aún no se llama. Además, existe la sugerencia de establecer la barra de estado para que se oculte en el método delegado navigationController willShowViewController. Una vez más, todo lo que hace es ocultar la barra de estado, que no resuelve el problema. Como resultado, parece que el estilo de la barra de estado se cambia al presionar sobre la stack de navegación del UIImagePickerController. Para resolver el problema por completo, no tuve que escribir extensiones o la subclase UIImagePickerController. Todo lo que necesita hacer es configurar el delegado y configurar el estilo de la barra de estado para que siga siendo el mismo. Esta adición hizo que el problema nunca existiera.

 let pickerController = UIImagePickerController() pickerController.delegate = self func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) { UIApplication.sharedApplication().setStatusBarStyle(.LightContent, animated: false) } 

De hecho, encontré una mejor manera de establecer el color de fondo de la barra de estado en el selector de imagen. Básicamente, debe establecer la imagen de fondo desde la barra de navegación a nulo, ya que por defecto en el selector de imagen tiene una imagen de fondo como una imagen blanca.

Intereting Posts