66
votes

My App’s background colour is black. Cause the whole view is below the status bar on iOS 7, the content on the status bar will hard to be distinguished. So how to change status bar’s content colour to white?

I've tried preferredStatusBarStyle and several other ways, but failed.

10

10 Answers

189
votes
  1. Set "View controller-based status bar appearance” to NO in your info.list file;
  2. Insert

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    

    to -application:didFinishLaunchingWithOptions: of the AppDelegate.m.


Note: UIStatusBarStyleDefault is the default value for the status bar style, it'll show black content instead. Both UIStatusBarStyleBlackTranslucent & UIStatusBarStyleBlackOpaque are deprecated in iOS 7.0.


UPDATE for iOS 9:

As @ZakariaDarwish mentioned, the method -setStatusBarStyle is deprecated in iOS 9. (Note: The original question was asked for iOS 7 long time ago, and I don't support it now, the new solution below works for me under iOS 9, hence update here.)

So, the only way left (at least for now) is to implement -preferredStatusBarStyle in your view controller (remember to set "View controller-based status bar appearance" back to YES).

You can invoke UIViewController's instance method -setNeedsStatusBarAppearanceUpdate once value changed in -preferredStatusBarStyle or -prefersStatusBarHidden.

There're also two methods -childViewControllerForStatusBarStyle & -childViewControllerForStatusBarHidden to return the preferred style from child view controller as you want.

e.g., if you used below methods

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

to switch status bar style before, you can use code sample below

- (void)shouldChangeStatusBarStyleToLightContent:(BOOL)toLightContent
                                        animated:(BOOL)animated
{
  _shouldChangeStatusBarStyleToLightContent = toLightContent;
  if (animated) {
    [UIView animateWithDuration:.3f animations:^{ [self setNeedsStatusBarAppearanceUpdate]; }];
  } else {
    [self setNeedsStatusBarAppearanceUpdate];
  }
}

- (UIStatusBarStyle)preferredStatusBarStyle
{
  return (_shouldChangeStatusBarStyleToLightContent ? UIStatusBarStyleLightContent : UIStatusBarStyleDefault);
}

for this updated solution now.

70
votes

In your *-Info.plist file:

  1. Set 'View controller-based status bar appearance' to NO
  2. Set 'Status bar style' to UIStatusBarStyleLightContent

Alternatively you can specify Status bar style as 'Black Opaque' or 'Black Translucent' in General tab of the Target.(in Xcode 5.0.1) But they are obsoleted values.

26
votes

I use this in main controller:

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}
14
votes

Place these two keys in info.plist

enter image description here

9
votes

Here a short and simple solution to set status bar color White

1) First copy this line View controller-based status bar appearance to in your .plist file and set Boolean NO;

2) In your AppDelegate.m file under didFinishLaunchingWithOptions paste this

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
[[UIApplication sharedApplication] setStatusBarHidden:NO];

OR add in .plist

enter image description here

6
votes

iOS 9 (deprecated warning workaround)

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
5
votes
    #ifdef __IPHONE_7_0
    # define STATUS_STYLE UIStatusBarStyleLightContent
    #else
    # define STATUS_STYLE UIStatusBarStyleBlackTranslucent
    #endif

    [[UIApplication sharedApplication] setStatusBarStyle:STATUS_STYLE animated:YES];
5
votes

If your application have different status bar's content color for each view controller the preferred method would be implementing

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

If you need to change the bar's content color globally throughout the application then add following lines of code in your didFinishLaunchingWithOptions method in AppDelegate

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        UIApplication.shared.statusBarStyle = .lightContent
        return true
    }

Wait setting the statusBarStyle does nothing if your application is using the default UIViewController-based status bar system. For this

Set "View controller-based status bar appearance” to NO in your info.list file

4
votes

Just a note, since this was there. If you are using a UINavigationController, you can throw this into the view controllers viewDidLoad method:

self.navigationController.navigationBar.barStyle = UIStatusBarStyleLightContent;
2
votes

To do it programmatically in Swift 3 try this anywhere in your view controller.

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
  }

I also set the plist key "View controller-based status bar appearance" to YES.