ErikLm
ErikLm

Reputation: 411

Is it possible to change Status Bar color for all view controllers?

I have been searching for a while now and I only found answers that describe to change color on one view controller not for all view controllers.

Is it possible to do it?

Upvotes: 6

Views: 11137

Answers (7)

Clément Cardonnel
Clément Cardonnel

Reputation: 5227

Only two steps are needed to change the status bar style for the entire app. 🙂

Step 1

Add a new property to the project's Info.plist file and set it to false.

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

Step 2

Go to your project's target and under General / Deployment Info, switch Status Bar Style from Default to Light.

The Status Bar Style option can be found right under the device orientation selectors of the Xcode project's editor.

Doing these steps will ensure the status bar behaves the same in the entire project.

Upvotes: 13

oscar castellon
oscar castellon

Reputation: 3138

Swift 4 In AppDelegate.swift add this extension:

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

Upvotes: 1

Uday Babariya
Uday Babariya

Reputation: 1021

Set the style of the status bar in AppDelegate.swift:

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

    return true
}

And add the following code to your Info.plist:

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

Upvotes: 6

Hexfire
Hexfire

Reputation: 6058

Important clarification

It is very important to understand two approaches to customizing the status bar.

Is it possible to change Status Bar color for all view controllers?

Boolean answer is Yes, but, in legal way, it is so close to No that answering Yes is provocative if you need colors other that black or white.

There are two approaches when it comes to customizing Status bar appearance.

First approach – one color for whole app

In info.plist you find or create a key called

View controller-based status bar appearance

and set it to NO.

What it does? It essentially establishes a setting that says that in your application, status bar appearance is not defined individually by each view controller. This is super important to understand. This means that you have uniform setting for entire app, for all screens. This is what you needed. But. You are limited to only two settings: white and black. And there's no way you can customize it using documented API.

To set this up:

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

Second approach – individual color for each view controller

This is the opposite. To make it work, go ahead to info.plist and set

View controller-based status bar appearance

to YES

This way, whenever a new view controller is open, status bar style is set individually if you insert this implementation in each UIViewController instance you need:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

You have the same as in first, set either dark or light style for statusbar.

Third approach – Hack!

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    if let statusbar = value(forKey: "statusBar") as? UIView {
        statusbar.backgroundColor = UIColor.blue
    }

    return true
}

Why hack? If you need status bar color other than black or white. Here you use undocumented API. You get statusBar object using KVC and manually set its color. This is dirty, not legal way, but so far it's the only way to set up custom color for statusbar. It may well lead your app to being rejected. But maybe you're lucky. In order to set it once and for all, you will need to set to NO the aforementioned flag so that status bar did not initialize its style with each view controller.

Upvotes: 0

Krunal
Krunal

Reputation: 79636

You can set background color for status bar during application launch or during viewDidLoad of your view controller.

extension UIApplication {

    var statusBarView: UIView? {
        return value(forKey: "statusBar") as? UIView
    }

}

// Set upon application launch, if you've application based status bar
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

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


or 
// Set it from your view controller if you've view controller based statusbar
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        UIApplication.shared.statusBarView?.backgroundColor = UIColor.red
    }

}



Here is result:

enter image description here


Here is Apple Guidelines/Instruction about status bar change. Only Dark & light (while & black) are allowed in status bar.

Here is - How to change status bar style:

If you want to set status bar style, application level then set UIViewControllerBasedStatusBarAppearance to NO in your `.plist' file.

Or programatically you can do it from app delegate:

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

if you wan to set status bar style, at view controller level then follow these steps:

  1. Set the UIViewControllerBasedStatusBarAppearance to YES in the .plist file, if you need to set status bar style at UIViewController level only.
  2. In the viewDidLoad add function - setNeedsStatusBarAppearanceUpdate

  3. override preferredStatusBarStyle in your view controller.

-

override func viewDidLoad() {
    super.viewDidLoad()
    self.setNeedsStatusBarAppearanceUpdate()
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Set value of .plist according to status bar style setup level. enter image description here

Upvotes: 2

Faysal Ahmed
Faysal Ahmed

Reputation: 7669

First in info.plist set View controller-based status bar appearance to NO

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.

let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
   if statusBar.responds(to:#selector(setter: UIView.backgroundColor)) {
        statusBar.backgroundColor = UIColor.blue
    }
    UIApplication.shared.statusBarStyle = .lightContent

    return true
}

The output screenshot is below enter image description here

Upvotes: 2

Harish Singh
Harish Singh

Reputation: 765

Yes, Step 1: Open your info.plist and insert a new key named "View controller-based status bar appearance" to NO

Step 2: Open the viewcontroller file where you want to change the statusBarStyle and put the following code in viewWillAppear(),

UIApplication.shared.statusBarStyle = .lightContent

Step 3 :

Also, implement the viewWillDisappear() method for that specific viewController and put the following lines of code,

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.shared.statusBarStyle = UIStatusBarStyle.default
}

All the best

Upvotes: 0

Related Questions