Die iOS 7 Transition Guide geben einen guten Hinweis, wie man die UIStatusBarStyle
dynamisch in einer UIViewController
mit ändert
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleDefault;
}
zusammen mit [self setNeedsStatusBarAppearanceUpdate];
Dies funktioniert problemlos in einer Einzelansicht. Ich versuche jetzt jedoch, die UIStatusBarStyle
in einer modalen Ansicht in UIStatusBarStyleLightContent
zu ändern. Es gibt eine MainViewController
, die zu der ModalViewController
übergeht, die selbst in eine NavigationController
eingebettet ist. Die ModalViewController
hat ihren Stellvertreter auf die MainViewController
gesetzt.
Ich habe versucht, [self setNeedsStatusBarAppearanceUpdate];
in der ModalViewController
zusammen mit der folgenden Methode in dieser Klasse ohne Wirkung aufzurufen:
// In ModalViewController.m
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
Ich habe auch versucht, [self setNeedsStatusBarAppearanceUpdate];
in MainViewController
on prepareForSegue: sender:
mit Bedingungen in - (UIStatusBarStyle)preferredStatusBarStyle {}
aufzurufen, um UIStatusBarStyleLightContent
zurückzugeben, wenn die modale Ansicht angezeigt wird - aber das hat auch keine Auswirkungen.
Wie kann ich den UIStatusBarStyle in der modalen Ansicht ändern?
EDIT: Post updated: Ich muss erwähnen, dass die ModalViewController
in eine NavigationController
mit einer NavigationBar
eingebettet ist. Wenn NavigationBar
auf hidden gesetzt ist, funktioniert der Aufruf von [self setNeedsStatusBarAppearanceUpdate];
in ModalViewController
einwandfrei. Aber nicht, wenn die Leiste sichtbar ist.
Sie benötigen einen ViewController, der im Vollbild angezeigt wird, um die entsprechenden Statusleisteninformationen anzuzeigen. In Ihrem Fall: Der NavigationController, der ModalViewController enthält, muss preferredStatusBarStyle
implementieren und UIStatusBarStyleLightContent
zurückgeben.
Ein Aufruf von setNeedsStatusBarAppearanceUpdate
ist nur erforderlich, wenn die Werte, die ein View-Controller tatsächlich zurückgibt, sich ändern. Wenn der View Controller zum ersten Mal präsentiert wird, werden sie trotzdem abgefragt.
Es sollte beachtet werden, dass Nicht-Vollbild-ModalVC verwenden kann modalPresentationCapturesStatusBarAppearance
, um den StatusBar-Stil zu steuern.
Wer mehr über die Statusleisten-Steuerung erfahren möchte, sollte das UIViewController, das die Statusleiste verwaltet nicht ignorieren.
Update am 06.11.2015:
Stellen Sie sicher, dass Sie UIViewControllerBasedStatusBarAppearance
in iOS Keys eingestellt haben.
Update am 2018.04.09:
Mir ist aufgefallen, dass viewController in einem navController unter iOS 10.0 - 10.2 möglicherweise keinen Aufruf prefersStatusBarHidden
erhält. Passen Sie Ihren navigationController an, um dies sicherzustellen
@implementation YourCustomNavController
//for iOS 10.0 - iOS 10.2
- (BOOL)prefersStatusBarHidden {
UIViewController *childVC = [self childViewControllerForStatusBarHidden];
if (childVC) {
return [childVC prefersStatusBarHidden];
}
return [super prefersStatusBarHidden];
}
@end
Jeder, der tiefer in das Innere gehen möchte, kann mit Hopper oder IDA Pro in UIKit +[UIViewController _currentStatusBarStyleViewController]
einsteigen. Es kann helfen, diese Art von Fehlern zu beheben.
Der Schlüssel zu dieser Arbeit ist, dass nur der Vollbild-Ansichts-Controller den Stil der Statusleiste bestimmt.
Wenn Sie einen Navigationscontroller verwenden und die Statusleiste auf Pro-View-Controller-Basis steuern möchten, müssen Sie UINavigationController subclassieren und bevorzugterStatusBarStyle so implementieren, dass die Einstellung von topViewController zurückgegeben wird.
Stellen Sie sicher, dass Sie die Klassenreferenz in Ihrer Storyboard-Szene von UINavigationController in Ihre Unterklasse ändern (z. B. in MyNavigationController im folgenden Beispiel).
(Das Folgende funktioniert für mich. Wenn Ihre App TabBar-basiert ist, möchten Sie etwas ähnliches tun, indem Sie den UITabBarController subclassieren, aber ich habe das nicht ausprobiert).
@interface MyNavigationController : UINavigationController
@end
@implementation MyNavigationController
- (UIStatusBarStyle)preferredStatusBarStyle
{
return self.topViewController.preferredStatusBarStyle;
}
@end
Um die Statusleiste des UINavigationController zu ändern, der Ihren ViewController einbettet, ohne den UINavigationController zu unterteilen, verwenden Sie Folgendes:
navigationController?.navigationBar.barStyle = .Black // to make the status bar text white
Schwarz wird den Text weiß (Statusleiste und Titel der Ansicht), während .Default einen schwarzen Titel und eine Statusleiste hat.
Ich hatte einen Side Menu/Reveal-Controller (SWRevealController), der sich immer als Root-Controller für Statusleistenabfragen erwies. Durch Überschreiben von childViewControllerForStatusBarStyle
lasse ich die Abfrage an den vordersten Controller umleiten.
/**
This view is always considered the topmost for status bar color queries.
Pass the query along to what we're showing in front.
*/
- (UIViewController *)childViewControllerForStatusBarStyle
{
UIViewController *front = self.frontViewController;
if ([front isKindOfClass:[UINavigationController class]])
return ((UINavigationController*)front).topViewController;
else
return front;
}
Das funktioniert für mich:
View controller-based status bar appearance
auf NO
UIStatusBarStyleLightContent
(kopieren Sie einfach diesen Wert)[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
Hoffe, es hilft (ref: ios7-Statusleiste, die in modalen Ansichten wieder schwarz wird? )
Es scheint, als ob die App den statusBarStyle des obersten viewControllers verliert. Wenn Sie also einen weiteren viewController über Ihren aktuellen Controller hinzufügen, erhält er nun die Hinweise vom neuen viewController.
Schauen Sie einfach nach, ob rootViewController Ihrer App überschrieben werden muss - (UIStatusBarStyle) - PreferredStatusBarStyle-Methode
Alle oben genannten Arbeiten. Manchmal finde ich es aber wirklich schwierig, jede Instanz im Storyboard usw. zu ändern. Also hier ist etwas, was für mich funktioniert und auch eine Unterklasse beinhaltet.
Erstellen Sie zuerst die Unterklasse:
@interface HHNavLightColorBarController : UINavigationController
@end
@implementation HHNavLightColorBarController
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
@end
Dann die Magie von Objective-C und ein wenig von <objc/runtime.h> verwenden
Wenn Sie eine Referenz des View-Controllers und Ihrer Präsentation haben:
UINavigationController *navVC = ...; // Init in your usual way
object_setClass(navVC, [HHNavLightColorBarController class]);
[self presentViewController:nav animated:YES completion:^{
NSLog(@"Launch Modal View Controller");
}];
Manchmal wirkt es etwas weniger aufdringlich. Sie könnten wahrscheinlich sogar eine Kategorie erstellen, in der überprüft wird, ob Ihre kindOfClass ein Navigationscontroller ist, und dies automatisch für Sie erledigt. Wie dem auch sei, die Antwort von jaetzold ist oben, ich fand es einfach praktisch.