web-dev-qa-db-fra.com

iOS 7: la barre d'état du contrôleur de vue modale a une couleur incorrecte, mais les contrôleurs de vue normaux sont corrects

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.

18
chadbag

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;
}
14
chie

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];
13
Scott Berrevoets

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!

2
Tzegenos

Définissez UIViewControllerBasedStatusBarAppearance sur NO dans votre info.plist

2
Frane Poljak

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];
}
2
meaning-matters

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];

}
2
user2163433

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

1
niklassaers

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:

  1. Ma boîte de dialogue modale a de toute façon une barre de navigation (bien qu’elle ne soit pas utilisée pour la navigation; elle est simplement utilisée pour sauvegarder ou ignorer les résultats.
  2. La couleur de la barre d'état a déjà été définie dans 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.

0
dave

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.

0
rjobidon