I need to let a specific ViewController embedded in an UINavigationController
to have light status bar text color (but other ViewController
s to behave differently). I am aware of at least 3 methods, none of which however work in my case.
How to change Status Bar text color in iOS 7, the method is primarily:
- Set the
UIViewControllerBasedStatusBarAppearance
toYES
in the plist - In viewDidLoad do a
[self setNeedsStatusBarAppearanceUpdate];
Add the following method:
- (UIStatusBarStyle)preferredStatusBarStyle{ return UIStatusBarStyleLightContent; }
Running on iOS 7.0.3, this method does not work for me, since even after I have implemented all 3 steps correctly,
preferredStatusBarStyle
is never called.- Set the
UIStatusBarStyle PreferredStatusBarStyle does not work on iOS 7, the method is primarily:
Setting your
navigationBar
’sbarStyle
toUIBarStyleBlackTranslucent
will give white status bar text (ie.UIStatusBarStyleLightContent
), andUIBarStyleDefault
will give black status bar text (ie.UIStatusBarStyleDefault
).This method works fair and square on iPhone, but not on iPad.
Setting the
UIViewControllerBasedStatusBarAppearance
toNO
in the plist, and use[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
This clearly doesn't apply in this case, since I need to only specify different status bar colors for two of the
ViewController
s.
Thanks for all help!
For people having this problem with a
UINavigationController
I can recommend creating a customUINavigationController
and implementing thepreferredStatusBarStyle
on it like this:That way the statusbar style will be that of the top view controller. Now you can implement the view controller's
preferredStatusBarStyle
anyway you like.I used the first method you mentioned, I also found there's kinda bug when you used
UINavigationController
, it will never passpreferredStatusBarStyle
call to it's child view controllers. What I have done is subclass theUINavigationController
, and overridepreferredStatusBarStyle
method as follows:Then whenever I need a navigation controller, I use
GLBaseNavigationController
instead ofUINavigationController
. For storyboards, you need to specify the class of the navigation controller to your subclass as well.Here's an improvement to Groot answer, in form of a simple category to UINavigationController, without the need to subclass UINavigationController.
Swift
Swift 3 & Swift 4
Objective-C
For your first solution, I don't think you can change the status bar in viewDidLoad. If you have two ViewControllers stacked on top of each other, and each one toggles the status bar differently, that method will only get called once for each. You really want to change the status bar in
viewWillAppear
so that it gets called each time the page is shown. I also don't think you can rely onpreferredStatusBarStyle
since I'm also not sure how often/when that gets called. This is how you want to do it:To set
UIStatusBarStyle
individually for eachUIViewController
onUINavigationController
stack you have to first subclass yourUINavigationController
and overridechildViewControllerForStatusBarStyle
method.In your UINavigationController subclass add:
than you can set
UIStatusBarStyle
to whatever you want in everyUIViewController
usingpreferredStatusBarStyle
method. Eg:In your AppDelegate didFinishLaunch method, set the default status bar style, say:
Then, in your those two view controllers, where you want to change status bar, override following methods: