UIStatusBarStyle not working in Swift

IosSwiftAppdelegateUistatusbarXcode6

Ios Problem Overview


I'm trying to change the Status Bar color in my Swift app to white, but am hitting a brick wall. I have 3 ViewControllers that are each embedded in a NavigationController (could that be the issue? I've already tried to place the code in the NavigationController class.) I've tried both of the following pieces of code in the didFinishLaunchingWithOptions of my AppDelegate.swift file but neither worked.

application.statusBarStyle = .LightContent

and

UIApplication.sharedApplication().statusBarStyle = .LightContent

All that the Docs have to say about it is that UIBarButtonStyle is an Int and gave me this enum snippet which didn't help me at all with implimentation.

enum UIStatusBarStyle : Int {
    case Default
    case LightContent
    case BlackOpaque
}

What am I missing?

Ios Solutions


Solution 1 - Ios

You have two options.

If you want to continue manually setting the style of the status bar, continue doing what you're doing, but you'll need to add the following key to your info.plist file with a value of NO.

> View controller-based status bar appearance

Or, if you want to continue to use view controller based status bar appearance, instead of setting the application's statusBarStyle, override the preferredStatusBarStyle property in each view controller for which you'd like to specify a status bar style.

Swift 3

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Swift 2

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
}

Solution 2 - Ios

> Swift 3.0

in AppDelegate.swift didFinishLaunchingWithOptions

UIApplication.shared.statusBarStyle = .lightContent

Info.plist

View controller-based status bar appearance -> NO

> Swift 2.2

in AppDelegate.swift didFinishLaunchingWithOptions

UIApplication.sharedApplication().statusBarStyle = .LightContent

Info.plist

View controller-based status bar appearance -> NO

Solution 3 - Ios

You have to set the:

navigationController.navigationBar.barStyle = .black

and the text will appear in white

Solution 4 - Ios

For iOS9.x and Xcode7, just put this inside AppDelegate.swift:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    UINavigationBar.appearance().barStyle = .Black

} 

This will automatically turn your status bar's style to .Lightcontent for all the view controllers inside a UINavigationController.

(Also, delete View controller-based status bar appearance from Info.plist to suppress the warnings you're probably seeing too!)

Solution 5 - Ios

In Swift 3, status bar style has changed to a computed property in UIViewController that you can override like this:

override var preferredStatusBarStyle: UIStatusBarStyle {
   return .lightContent //or default
} 

Solution 6 - Ios

On iOS 9 the following (setStatusBarStyle) is deprecated and you will get a warning if you go that way.

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

If you want all statusBars changed in a single shot try adding the following to your Info.plist. This will also make your launch-screen status bar white. While the code above won't.

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

Solution 7 - Ios

for me all above dind't work until i add:

self.navigationController?.navigationBar.barStyle = .black;

so:

  1. Set UIViewControllerBasedStatusBarAppearance to YES in .plist
  2. In viewDidLoad call self.setNeedsStatusBarAppearanceUpdate();
  3. Override preferredStatusBarStyle
    override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
  4. In overrided method i set also the navigationBar.barStyle so final
    for light content:
    override var preferredStatusBarStyle: UIStatusBarStyle { self.navigationController?.navigationBar.barStyle = .black;//or default return .lightContent //or default }
    and for black content use default

The source from here and here.

and if this doesn't work you can try add a UINavigationController extension:

extension UINavigationController
{
    override open var preferredStatusBarStyle: UIStatusBarStyle {
        if let lastVC = self.viewControllers.last
        {
            return lastVC.preferredStatusBarStyle
        }
        
        return .default
    }
}

Solution 8 - Ios

Strange, using Swift 3.1 & XC8.2.1, but all of the above didn't work.

What I did, is just

extension UINavigationController
{
    override open var preferredStatusBarStyle: UIStatusBarStyle {
        get {
            return .lightContent
        }
    }
}

No Plist, no other stuff. HTH

Solution 9 - Ios

In Swift 3.0 you can override a getter in ViewController for View controller-based status bar appearance:

override var preferredStatusBarStyle: UIStatusBarStyle {
    get { return .lightContent }
}

Solution 10 - Ios

Don't edit your Info.plist. Add this to your ViewController.swift:

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
}

Solution 11 - Ios

Step 1. Add to info.plist View controller-based status bar appearance -> NO

Step 2. Add code in method where you need to change status bar color:

UIApplication.shared.statusBarStyle = .lightContent //(or .default)
setNeedsStatusBarAppearanceUpdate()

Key line of code: setNeedsStatusBarAppearanceUpdate()

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiondavidrayowensView Question on Stackoverflow
Solution 1 - IosMick MacCallumView Answer on Stackoverflow
Solution 2 - IosMaselkoView Answer on Stackoverflow
Solution 3 - IosNico S.View Answer on Stackoverflow
Solution 4 - IosBiodaveView Answer on Stackoverflow
Solution 5 - IosEric WelanderView Answer on Stackoverflow
Solution 6 - IosGuiSoySauceView Answer on Stackoverflow
Solution 7 - IosConstantin SaulencoView Answer on Stackoverflow
Solution 8 - IosLord iPhoniusView Answer on Stackoverflow
Solution 9 - IosDenis KreshikhinView Answer on Stackoverflow
Solution 10 - IosSevView Answer on Stackoverflow
Solution 11 - IosIgorView Answer on Stackoverflow