J'ai un problème dans iOS7 où un contrôleur de vue poussé UINavigationController normal a la couleur de texte de barre d'état correcte pour la couleur de barre de navigation UINavigationController (qui est gris clair, presque blanc, donc le texte de la barre d'état est noir). Toutefois, lorsqu'un contrôleur de vue "modal" est présenté à l'aide de -presentViewController:animated:completion:
, la couleur du texte de la barre d'état devient blanche et il est très difficile de voir en raison de la couleur de la barre de navigation. La couleur de la barre de navigation est toujours la même dans l’ensemble de l’application et ne change pas pour chaque contrôleur de vue. Cela se produit à chaque appel -presentViewController
.
"Apparence de la barre d'état basée sur le contrôleur d'affichage" est défini sur OUI.
Je ne sais pas quoi regarder pour essayer de résoudre ce problème.
définissez YourModalViewControler.modalPresentationCapturesStatusBarAppearance sur YES et conservez "Afficher l'apparence de la barre d'état basée sur le contrôleur" sur YES.
- (void)viewDidLoad {
[super viewDidLoad];
self.modalPresentationCapturesStatusBarAppearance = YES;
....
}
puis écrasez preferredStatusBarStyle
- (UIStatusBarStyle)preferredStatusBarStyle {
return TheStyleYouWant;
}
Le contrôleur de navigation décide d’avoir un contenu clair ou sombre en fonction de la propriété barStyle
de sa barre de navigation. La valeur par défaut, UIBarStyleDefault
, signifie que la barre de navigation est de couleur claire et que la barre d’état est sombre. Le fait de changer cette propriété en UIBarStyleBlack
ne rend pas la barre de navigation noire (la couleur de la barre de navigation est toujours définie à l'aide de barTintColor
), mais elle indique que sa couleur est sombre. Le contrôleur de navigation décide ensuite que, la barre de navigation étant sombre, le contenu de la barre d'état doit être allumé.
Il semble que sur votre contrôleur de navigation principal (sur lequel vous appuyez sur des objets), la variable barStyle
est bien définie sur UIBarStyleBlack
quelque part. Vous devez faire la même chose avec le contrôleur de navigation à présentation modale, comme suit:
UINavigationController *newViewController = [[UINavigationController alloc] initWithRootViewController:modalViewController];
newViewController.navigationBar.barStyle = self.navigationController.navigationBar.barStyle;
[self presentViewController:newViewController animated:YES completion:nil];
Je viens de comprendre comment faire cela. J'ai eu exactement le même problème et il semble que cela fonctionne comme un charme!
La première chose à faire est de changer un attribut de votre fichier .plist de votre projet en NO. L'attribut est: "Afficher l'apparence de la barre d'état basée sur le contrôleur". Si l'attribut n'existe pas, n'hésitez pas à en ajouter un, exactement comme je viens de vous l'écrire (sans guillemets).
La deuxième chose est d'ajouter à la méthode viewDidLoad de chaque contrôleur de vue
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
si vous voulez que le texte de votre barre d'état soit en blanc ou
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
si vous voulez que le texte de votre barre d'état soit en noir.
C'est tout!
Définissez UIViewControllerBasedStatusBarAppearance
sur NO
dans votre info.plist
Cela marche. Mais je ne suis pas content parce que c'est un peu hacky. Je pense que c'est un bug que preferredStatusBarStyle
n'est pas appelé pour une vue modale. Va demander à Apple.
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
[self setNeedsStatusBarAppearanceUpdate];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
[self setNeedsStatusBarAppearanceUpdate];
}
Vous pouvez redéfinir la méthode preferredStatusBarStyle dans votre classe de contrôleur de navigation.
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
// or UIStatusBarStyleBlackOpaque, UIStatusBarStyleBlackTranslucent, or UIStatusBarStyleDefault
}
et vous pouvez également définir une "méthode de chargement de vues" pour définir les couleurs personnalisées que vous souhaitez
- (void) viewDidLoad
{
UIColor *barColor = [UIColor whitecolor];
UIView *colorView = [[UIView alloc] initWithFrame:CGRectMake(0.f, -20.f, 320.f, 64.f)];
colorView.opaque = NO;
colorView.alpha = .5f;
colorView.backgroundColor = barColor;
self.navigationBar.barTintColor = barColor;
self.navigationBar.tintColor = [UIColor whiteColor];
[self.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}];
/*self.navigationController.navigationBar.barTintColor = [UIColor blackColor];
self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
[self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor whiteColor]}];
self.navigationController.navigationBar.translucent = NO;*/
[self.navigationBar.layer insertSublayer:colorView.layer atIndex:0];
}
J'avais le même problème que vous. Le fichier info.plist était correct et partout ailleurs, preferredStatusBarStyle était appelé correctement. Mais pas dans ma vue modale. En effet, preferredStatusBarStyle a été envoyé au contrôleur de navigation. J'ai donc créé une sous-classe de UINavigationController qui a transféré sur preferredStatusBarStyle au contrôleur de vue qu'il présentait, et le tour est joué, tout se comportait comme il se doit
Après avoir examiné toutes les réponses fournies ici et dans d’autres réponses, j’ai trouvé que la seule solution qui fonctionnait pour moi était de créer une barre de navigation vide pour le contrôleur de vue que je présente de manière modale.
Cela peut ne pas fonctionner pour vous, mais cela fonctionne pour moi pour les raisons suivantes:
applicationDidFinishLaunching
à l'échelle de l'application, comme indiqué ci-dessus, et elle a une couleur personnalisée.Du point de vue de l’ingénierie, il est quelque peu agaçant d’avoir un contrôleur de navigation qui ne fasse rien, mais sans lui, je n’aurais pas pu surmonter ce problème.
Ma solution:
newViewController.modalPresentationStyle = .fullScreen
Par défaut, UINavigationController décide du style de la barre d'état et remplace tous les styles de contrôleurs de sous-vue. Cependant, lorsqu'un contrôleur de vue modale est en plein écran, sa méthode preferredStatusBarStyle
est appelée.