wake-up-neo.com

iOS 7: Die Statusleiste des modalen Ansichtscontrollers weist eine falsche Farbe auf, die normalen Ansichtscontroller sind jedoch korrekt

Ich habe unter iOS7 ein Problem, bei dem ein normaler UINavigationController-Push-View-Controller die korrekte Statusfarbentextfarbe für die UINavigationController-Navigationsleistenfarbe hat (die hellgrau und fast weiß ist, sodass der Statusleistentext schwarz ist). Wenn jedoch ein "modaler" View-Controller mit -presentViewController:animated:completion: angezeigt wird, wird die Textfarbe der Statusleiste in Weiß geändert und ist angesichts der Farbe der Navigationsleiste nur sehr schwer zu erkennen. Die Farbe der Navigationsleiste ist in der gesamten App immer gleich und ändert sich nicht für jeden Ansichts-Controller. Dies geschieht bei jedem -presentViewController-Aufruf.

"Controller-basierte Statusleiste anzeigen" ist auf JA gesetzt.

Ich bin mir nicht sicher, worauf ich achten muss, um dies zu lösen.

18
chadbag

setzen Sie YourModalViewControler.modalPresentationCapturesStatusBarAppearance auf YES, und behalten Sie "View controller-based Statusbar aussehen" bei YES.

- (void)viewDidLoad {
    [super viewDidLoad];
    self.modalPresentationCapturesStatusBarAppearance = YES;
    ....
}

dann überschreiben Sie bevorzugterStatusBarStyle

- (UIStatusBarStyle)preferredStatusBarStyle {
    return TheStyleYouWant;
}
14
chie

Der Navigationscontroller entscheidet anhand der barStyle -Eigenschaft seiner Navigationsleiste, ob ein heller oder dunkler Inhalt vorhanden ist. Die Standardeinstellung UIBarStyleDefault bedeutet, dass die Navigationsleiste hell ist und die Statusleiste dunklen Inhalt hat. Wenn Sie diese Eigenschaft in UIBarStyleBlack ändern, wird die Navigationsleiste nicht wirklich schwarz (die Farbe der Navigationsleiste wird weiterhin mit barTintColor eingestellt), sie sagt jedoch, dass sie eine dunkle Farbe hat. Der Navigationscontroller entscheidet dann, dass der Inhalt der Statusleiste auf hell gesetzt werden soll, da die Navigationsleiste dunkel ist.

Es sieht so aus, als ob die barStyle auf Ihrem Hauptnavigationscontroller (auf den Sie Dinge schieben) tatsächlich irgendwo auf UIBarStyleBlack gesetzt ist. Mit dem modal dargestellten Navigationscontroller müssen Sie das Gleiche tun, wie:

UINavigationController *newViewController = [[UINavigationController alloc] initWithRootViewController:modalViewController];
newViewController.navigationBar.barStyle = self.navigationController.navigationBar.barStyle;
[self presentViewController:newViewController animated:YES completion:nil];
13

Ich habe gerade herausgefunden, wie das geht. Ich hatte genau das gleiche Problem und es scheint, dass es wie ein Zauber funktioniert!

Als Erstes müssen Sie ein Attribut in Ihrer .plist-Datei Ihres Projekts in NO ändern. Das Attribut lautet: "Controller-basierte Statusleiste anzeigen". Wenn das Attribut nicht vorhanden ist, zögern Sie nicht, ein neues genau so hinzuzufügen, wie ich es Ihnen geschrieben habe (ohne Anführungszeichen).

Die zweite Sache ist, die viewDidLoad-Methode jedes View-Controllers hinzuzufügen 

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

wenn Sie möchten, dass der Text Ihrer Statusleiste weiß ist oder 

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];

wenn Sie möchten, dass der Text Ihrer Statusleiste schwarz ist.

Das ist alles!

2
Tzegenos

Setzen Sie UIViewControllerBasedStatusBarAppearance in Ihrem info.plist auf NO.

2
Frane Poljak

Das funktioniert. Aber ich bin nicht zufrieden damit, weil es ein bisschen hackig ist. Ich denke, es ist ein Fehler, dass preferredStatusBarStyle nicht für die modale Ansicht aufgerufen wird. Will Apple fragen.

- (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

Sie können die PreferredStatusBarStyle-Methode in Ihrer Navigationscontrollerklasse neu definieren

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
// or UIStatusBarStyleBlackOpaque, UIStatusBarStyleBlackTranslucent, or UIStatusBarStyleDefault

}

sie können auch eine "View Did Load-Methode" definieren, um die gewünschten benutzerdefinierten Farben festzulegen

- (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

Ich hatte das gleiche Problem wie Sie. Die info.plist war korrekt und überall wurde PreferredStatusBarStyle korrekt aufgerufen. Aber nicht in meiner modalen Ansicht. Das liegt daran, dass PreferredStatusBarStyle an den Navigationscontroller gesendet wurde. Also habe ich eine Unterklasse von UINavigationController erstellt, die preflestStatusBarStyle an den angezeigten View-Controller übergeben hat, und voila, alles hat sich wieder so verhalten, wie es sollte

1
niklassaers

Nachdem ich alle Antworten hier und in anderen Antworten durchgesehen habe, habe ich festgestellt, dass die einzige Lösung, die für mich funktioniert hat, darin bestand, eine leere Navigationsleiste erstellen für den Ansichtscontroller, den ich modal vorstelle.

Dies funktioniert möglicherweise nicht für Sie, aber es funktioniert aus folgenden Gründen für mich:

  1. Mein modaler Dialog hat sowieso eine Navigationsleiste (obwohl er nicht für die Navigation verwendet wird; er wird einfach verwendet, um die Ergebnisse entweder zu speichern oder zu verwerfen.
  2. Die Farbe der Statusleiste wurde bereits oben in applicationDidFinishLaunching anwendungsweit definiert und hat eine benutzerdefinierte Farbe.

Aus technischer Sicht ist es etwas ärgerlich, einen Navigationscontroller zu haben, der effektiv nichts bewirkt, aber ohne einen konnte ich dieses Problem nicht überwinden.

0
dave

Meine Lösung: 

newViewController.modalPresentationStyle = .fullScreen

Standardmäßig legt UINavigationController den Stil der Statusleiste fest und überschreibt alle Stile der Sub-View-Controller. Wenn jedoch ein Controller für modale Ansichten Vollbild ist, wird seine Methode preferredStatusBarStyle aufgerufen.

0
rjobidon