How do I change the colour of the status bar when the navigation bar is hidden in iOS 7?

4.5k views Asked by At

I am aware of how to change the colour of a navigation bar (and status bar) by doing this:

self.navigationController.navigationBar.barTintColor = [UIColor redColor];

But when I hide my navigation bar, the status bar color reverts back to transparent color.

How do I keep the status bar color the same as the barTintColor even when the navigation bar is hidden?

7

There are 7 answers

0
Maximilian Litteral On BEST ANSWER

Add a UIView under the status bar and set its backgroundColor property to the navigation bars barTintColor

1
Pavan On

You simply add a UIView to the current view with the correct statusBar measurements and then change the color.

Here's some sample code. First get the status bar's frame:

 //The statusBarFrame returns the frame in screen coordinates. I believe the correct way to get what this corresponds to in view coordinates is to do the following:
- (CGRect)statusBarFrameViewRect:(UIView*)view 
{
    CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
    CGRect statusBarWindowRect = [view.window convertRect:statusBarFrame fromWindow: nil];
    CGRect statusBarViewRect = [view convertRect:statusBarWindowRect fromView: nil];
    return statusBarViewRect;
}
//source: http://stackoverflow.com/questions/3888517/get-iphone-status-bar-height

Then create your view in the viewDidload method or whenever you hide your navigation bar with the following code:

UIView *statusBarUnderLay = [[UIView alloc] initWithFrame:[self statusBarFrameViewRect:self.view]];
[statusBarUnderLay setBackgroundColor:[UIColor yellowColor]];
[self.view addSubview:statusBarUnderLay];

and voila

0
david72 On

This fixed my issue:

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}
0
wgr On

I found a simple way to solve the problem using InterfaceBuilder. My problem is like this, there is an annoy white gap, after a hide the navigation bar.

[Before[1]

then I uncheck these two options

options

then It works

after## Heading ##

0
dev_exo On

My solution was simple setting the background color of the viewcontrollers' view. e.g.

[self.view setBackgroundColor:[UIColor blackColor]];

Adding a view needs to be handled for cases when the OS chooses not to show the status bar.

0
vikzilla On

This did the trick for me (in Swift):

let statusBarBGView = UIView(frame: UIApplication.sharedApplication().statusBarFrame)
statusBarBGView.backgroundColor = .whiteColor() //color of your choice
view.addSubview(statusBarBGView)

My problem was I had set my navigationBar to be hidden, which left the statusBar's background to be clear. This resulted in my tableView cells showing behind the statusBar as they were scrolled.

0
akira108 On

set self.tableView.contentInset = UIEdgeInsetsZero after self.navigationController?.navigationBarHidden = true