I have an issue in iOS7 where a normal UINavigationController pushed view controller has the correct status bar text color for the UINavigationController navbar color (which is a light gray, almost white so the status bar text is black). However, when a "modal" view controller is presented using -presentViewController:animated:completion:
, the status bar text color is changed to white and is very hard to see given the color of the navbar. Navbar color is always the same across the whole app and does not change for each view controller. This happens on every -presentViewController
call.
"View controller-based status bar appearance" is set to YES.
I am not sure what to look at to try and solve this.
This works. But I'm not happy with it because it a bit hacky. I think it's a bug that
preferredStatusBarStyle
is not called for modal view. Will ask Apple.You can redefine the preferredStatusBarStyle method in your navigation controller class
and you can also define a "view did load method" to set custom colors you want
Set
UIViewControllerBasedStatusBarAppearance
toNO
in yourinfo.plist
My solution:
By default, UINavigationController decides the status bar style and overrides all sub view controllers styles. However, when a modal view controller is fullscreen, its method
preferredStatusBarStyle
is called.I was having the same problem as you were having. The info.plist was correct and everywhere else preferredStatusBarStyle was called correctly. But not in my modal view. That is because preferredStatusBarStyle was sent to the navigation controller. So I made a subclass of UINavigationController that passed on preferredStatusBarStyle to the view controller it was presenting, and voila, all was behaving as it should again
The navigation controller decides whether to have a light or dark content based on its navigation bar's
barStyle
property. The default,UIBarStyleDefault
, means the navigation bar has a light color and the status bar will have dark content. Changing this property toUIBarStyleBlack
doesn't actually make the navigation bar black (the color of the navigation bar is still set usingbarTintColor
), but it tells it that it has a dark color. The navigation controller then decides that, since the navigation bar is dark, it should set the status bar content to light.It appears that on your main navigation controller (on which you push things) the
barStyle
is indeed set toUIBarStyleBlack
somewhere. You have to do the same thing to the modally presented navigation controller, like so: