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.)
Réponses
Trop de publicités?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;
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.
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?)
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.
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