ios7 - desventajas - ios 7 whatsapp
UIImagePickerController rompe la apariencia de la barra de estado (25)
¿Has intentado llamar a [self setNeedsStatusBarAppearanceUpdate]
cuando vuelve a aparecer tu controlador de vista [self setNeedsStatusBarAppearanceUpdate]
?
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 resto 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?
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.
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 pila 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 resto 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 resto 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 pila 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.
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;
}
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 pila.
el viewWillAppear asegura que este controlador de vista en sí mismo siempre se reinicia siempre que un controlador de vista presentante lo descarte arriba.
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
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.
Esto lo resolvió para mí ...
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[[UIApplication sharedApplication] setStatusBarHidden:YES];
[picker dismissViewControllerAnimated:YES completion:nil];
}
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.
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.
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];
}
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];
}
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
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;
}];
Otra solución más que puede funcionar en algunas situaciones.
let imagePicker = UIImagePickerController()
imagePicker.sourceType = .PhotoLibrary
imagePicker.navigationBar.barStyle = .Black
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];
}
Puedes probar esto Creo que needsStatusBarApperanceUpdate funcionará.
1 -Set UIViewControllerBasedStatusBarAppearance to NO.
2- Call [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
3- [self setNeedsStatusBarAppearanceUpdate];
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 = <custom_color>
/* Status bar color */
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
}
Todo lo anterior no funcionó para mí. Resolví el problema cambiando el estilo de presentación a:
imagePickerController.modalPresentationStyle = UIModalPresentationFullScreen;
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;
}
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://.com/a/19211669
Esta solución funciona para mí.
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];
}
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];
}