preferidoStatusBarStyle no se llama
Seguí este hilo para anular -preferredStatusBarStyle
, pero no se llama. ¿Hay alguna opción que pueda cambiar para habilitarlo? (Estoy usando XIB en mi proyecto).
Para cualquiera que utilice un UINavigationController:
No UINavigationController
reenvía preferredStatusBarStyle
llamadas a sus controladores de vista secundarios. En cambio, administra su propio estado; como debería, dibuja en la parte superior de la pantalla el lugar donde se encuentra la barra de estado y, por lo tanto, debería ser responsable de ello. Por lo tanto, la implementación preferredStatusBarStyle
en sus VC dentro de un controlador de navegación no hará nada: nunca serán llamados.
El truco es lo que UINavigationController
usa para decidir por qué regresar UIStatusBarStyleDefault
o UIStatusBarStyleLightContent
. Se basa en su UINavigationBar.barStyle
. El valor predeterminado ( UIBarStyleDefault
) da como resultado la UIStatusBarStyleDefault
barra de estado de primer plano oscura. Y UIBarStyleBlack
le dará una UIStatusBarStyleLightContent
barra de estado.
TL;DR:
Si quieres UIStatusBarStyleLightContent
un UINavigationController
uso:
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
Posible causa raíz
Tuve el mismo problema y descubrí que estaba sucediendo porque no estaba configurando el controlador de vista raíz en la ventana de mi aplicación.
El UIViewController
en el que había implementado preferredStatusBarStyle
se usó en un UITabBarController
, que controlaba la apariencia de las vistas en la pantalla.
Cuando configuré el controlador de vista raíz para que apuntara a this UITabBarController
, los cambios de la barra de estado comenzaron a funcionar correctamente, como se esperaba (y preferredStatusBarStyle
se estaba llamando al método).
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
... // other view controller loading/setup code
self.window.rootViewController = rootTabBarController;
[self.window makeKeyAndVisible];
return YES;
}
Método alternativo (obsoleto en iOS 9)
Alternativamente, puede llamar a uno de los siguientes métodos, según corresponda, en cada uno de sus controladores de vista, dependiendo de su color de fondo, en lugar de tener que usar setNeedsStatusBarAppearanceUpdate
:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
o
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
Tenga en cuenta que también deberá configurarlo UIViewControllerBasedStatusBarAppearance
en NO
el archivo plist si utiliza este método.
Entonces agregué una categoría a UINavigationController pero usé los métodos:
-(UIViewController *)childViewControllerForStatusBarStyle;
-(UIViewController *)childViewControllerForStatusBarHidden;
y esos devolvieron el UIViewController visible actual. Eso permite que el controlador de vista visible actual establezca su propio estilo/visibilidad preferido.
Aquí hay un fragmento de código completo:
En rápido:
extension UINavigationController {
public override func childViewControllerForStatusBarHidden() -> UIViewController? {
return self.topViewController
}
public override func childViewControllerForStatusBarStyle() -> UIViewController? {
return self.topViewController
}
}
En Objective-C:
@interface UINavigationController (StatusBarStyle)
@end
@implementation UINavigationController (StatusBarStyle)
-(UIViewController *)childViewControllerForStatusBarStyle {
return self.topViewController;
}
-(UIViewController *)childViewControllerForStatusBarHidden {
return self.topViewController;
}
@end
Y por si acaso, así es como se implementa en un UIViewController:
En rápido
override public func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}
override func prefersStatusBarHidden() -> Bool {
return false
}
En Objective-C
-(UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent; // your own style
}
- (BOOL)prefersStatusBarHidden {
return NO; // your own visibility code
}
Finalmente, asegúrese de que su lista de aplicaciones NO tenga la opción "Ver apariencia de la barra de estado basada en el controlador" configurada en NO. Elimine esa línea o configúrela en SÍ (¿que creo que es la opción predeterminada ahora para iOS 7?)
Para cualquiera que todavía tenga problemas con esto, esta sencilla extensión en Swift debería solucionar el problema.
extension UINavigationController {
override open var childForStatusBarStyle: UIViewController? {
return self.topViewController
}
}