282 votes

preferredStatusBarStyle n'est pas appelé

J'ai suivi ce fil pour remplacer -preferredStatusBarStyle , mais il n'est pas appelé. Existe-t-il des options que je peux modifier pour l'activer? (J'utilise des XIBs dans mon projet.)

1063voto

Tyson Points 3779

Pour toute personne utilisant un UINavigationController:

L' UINavigationController ne prend pas en avant sur l' preferredStatusBarStyle des appels à son enfant de voir les contrôleurs. Au lieu de cela, il gère son propre état - comme il se doit, c'est le dessin en haut de l'écran, où le statut de la barre de vie et doivent donc être responsable. À cet effet la mise en œuvre de preferredStatusBarStyle dans votre Cv dans un nav contrôleur ne rien faire, ils ne seront jamais appelés.

Le truc, c'est que l' UINavigationController utilise pour décider ce qu'il doit retourner pour UIStatusBarStyleDefault ou UIStatusBarStyleLightContent. Il tire sur sa UINavigationBar.barStyle. La valeur par défaut (UIBarStyleDefault) des résultats de l'avant-plan sombre UIStatusBarStyleDefault barre d'état. Et UIBarStyleBlack donnera un UIStatusBarStyleLightContent barre d'état.

TL;DR:

Si vous souhaitez UIStatusBarStyleLightContent sur UINavigationController d'utilisation:

self.navigationController.navigationBar.barStyle = UIBarStyleBlack;

122voto

Hippo Points 4073

Cause Possible

J'ai eu le même problème, et compris qu'il se passait parce que je n'étais pas la configuration de la racine-vue-contrôleur dans ma fenêtre de l'application.

L' UIViewController dans lequel j'avais mis en œuvre l' preferredStatusBarStyle a été utilisé dans un UITabBarController, qui contrôle l'apparence des points de vue sur l'écran.

Lorsque j'ai mis la racine de vue-contrôleur de point pour cette UITabBarController, la barre d'état change commencé à travailler correctement, comme prévu (et l' preferredStatusBarStyle méthode a été appelé).

(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ... // other view controller loading/setup code

    self.window.rootViewController = rootTabBarController;
    [self.window makeKeyAndVisible];
    return YES;
}

Méthode Alternative

Sinon, vous pouvez appeler l'une des méthodes suivantes, selon le cas, dans chacun de vos contrôleurs de vue, en fonction de sa couleur d'arrière-plan, au lieu d'avoir à utiliser setNeedsStatusBarAppearanceUpdate:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

ou

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];

Notez que vous aurez également besoin de fixer UIViewControllerBasedStatusBarAppearance de NO le fichier plist si vous utilisez cette méthode.

103voto

serenn Points 358

Alors j'ai ajouté une catégorie à UINavigationController mais utilisé les méthodes:

-(UIViewController *)childViewControllerForStatusBarStyle;
-(UIViewController *)childViewControllerForStatusBarHidden;

et il y avait ceux qui retourne le visible UIViewController. Qui laisse le courant d'affichage visible contrôleur de définir son propre style préféré et de la visibilité.

Voici un extrait de code pour:

@interface UINavigationController (StatusBarStyle)

@end

@implementation UINavigationController (StatusBarStyle)

-(UIViewController *)childViewControllerForStatusBarStyle {
    return self.visibleViewController;
}

-(UIViewController *)childViewControllerForStatusBarHidden {
    return self.visibleViewController;
}

@end

Et pour faire bonne mesure, voici comment il est mis en œuvre ensuite dans un UIViewController:

-(UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleLightContent; // your own style
}

- (BOOL)prefersStatusBarHidden {
    return NO; // your own visibility code
}

Enfin, assurez-vous que votre application plist ne PAS avoir la "Vue-contrôleur d'état basé sur l'apparence de la barre de" la valeur NO. Supprimer la ligne ou OUI (je crois que c'est la valeur par défaut maintenant pour iOS 7?)

9voto

Artem Abramov Points 1071

Un ajout à la réponse d'Hippo: si vous utilisez un UINavigationController, il est probablement préférable d'ajouter une catégorie:

 //  UINavigationController+StatusBarStyle.h:

@interface UINavigationController (StatusBarStyle)

@end



//  UINavigationController+StatusBarStyle.m:

@implementation UINavigationController (StatusBarStyle)

- (UIStatusBarStyle)preferredStatusBarStyle
{
    //also you may add any fancy condition-based code here
    return UIStatusBarStyleLightContent;
}

@end
 

Cette solution est probablement meilleure que le passage à un comportement bientôt obsolète.

1voto

Roman Truba Points 1195

Vous pouvez également créer une catégorie pour le contrôleur de navigation, qui contrôlera la couleur de la barre d'état par le dernier contrôleur:

 @implementation UINavigationController (LastControllerBar)

-(UIStatusBarStyle)preferredStatusBarStyle
{
    return [[self.viewControllers lastObject] preferredStatusBarStyle];
}
@end
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X