preferidoStatusBarStyle no se llama

Resuelto trgoofi asked hace 54 años • 25 respuestas

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).

trgoofi avatar Jan 01 '70 08:01 trgoofi
Aceptado

Para cualquiera que utilice un UINavigationController:

No UINavigationControllerreenvía preferredStatusBarStylellamadas 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 preferredStatusBarStyleen sus VC dentro de un controlador de navegación no hará nada: nunca serán llamados.

El truco es lo que UINavigationControllerusa para decidir por qué regresar UIStatusBarStyleDefaulto UIStatusBarStyleLightContent. Se basa en su UINavigationBar.barStyle. El valor predeterminado ( UIBarStyleDefault) da como resultado la UIStatusBarStyleDefaultbarra de estado de primer plano oscura. Y UIBarStyleBlackle dará una UIStatusBarStyleLightContentbarra de estado.

TL;DR:

Si quieres UIStatusBarStyleLightContentun UINavigationControlleruso:

self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
Tyson avatar Oct 22 '2013 09:10 Tyson

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 UIViewControlleren el que había implementado preferredStatusBarStylese 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 preferredStatusBarStylese 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 UIViewControllerBasedStatusBarAppearanceen NOel archivo plist si utiliza este método.

AbdullahC avatar Sep 26 '2013 15:09 AbdullahC

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?)

serenn avatar Oct 31 '2013 16:10 serenn

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
    }
}
Alex Brown avatar Feb 17 '2017 15:02 Alex Brown