How do I hide the status bar in a Swift iOS app?

IosIphoneIos7Swift

Ios Problem Overview


I'd like to remove the status bar at the top of the screen.

This does not work:

func application
(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: NSDictionary?)
-> Bool
{
        application.statusBarHidden = true
        return true
}

I've also tried:

func application
(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: NSDictionary?)
-> Bool
{
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
    
    var controller = UIViewController()
    application.statusBarHidden = true
    controller.setNeedsStatusBarAppearanceUpdate()
    
    var view = UIView(frame: CGRectMake(0, 0, 320, 568))
    view.backgroundColor = UIColor.redColor()
    controller.view = view
    
    var label = UILabel(frame: CGRectMake(0, 0, 200, 21))
    label.center = CGPointMake(160, 284)
    label.textAlignment = NSTextAlignment.Center
    label.text = "Hello World"
    controller.view.addSubview(label)
    
    self.window!.rootViewController = controller
    self.window!.makeKeyAndVisible()
    return true
}

Ios Solutions


Solution 1 - Ios

You really should implement prefersStatusBarHidden on your view controller(s):

Swift 3 and later

override var prefersStatusBarHidden: Bool {
    return true
}

Solution 2 - Ios

  1. Go to Info.plist file

  2. Hover on one of those lines and a (+) and (-) button will show up.

  3. Click the plus button to add new key Type in start with capital V and automatically the first choice will be View controller-based status bar appearance.

  4. Add that as the KEY.

  5. Set the VALUE to "NO"

  6. Go to you AppDelegate.swift

  7. Add the code, inside the method

     func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject:AnyObject]?) -> Bool {
         application.statusBarHidden = true
         return true
     }
    

DONE! Run your app and no more status bar!

Solution 3 - Ios

Swift 3

In Info.plist set View controller-based status bar appearance to NO

And call UIApplication.shared.isStatusBarHidden = true

Solution 4 - Ios

If you want to hide and bring back the status bar on button tap, while at the time of presenting and dismissing slide-in menu, popups etc, then you can use this method:-

To hide the status bar:-

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar

To bring back the status bar:-

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelNormal 

Solution 5 - Ios

if you prefer a visual approach rather than coding it use this method: in your info.plist

enter image description here simply add View controller-based status bar appearance to NO

and Status bar is initially hidden as YES

Solution 6 - Ios

Update for iOS 10 / Swift 3.0

No longer a function, now a property...

override var prefersStatusBarHidden: Bool {
    return true
}

Solution 7 - Ios

 override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(true);
    navigationController?.navigationBar.hidden = true // for navigation bar hide
    UIApplication.sharedApplication().statusBarHidden=true; // for status bar hide
}

Solution 8 - Ios

Go to your Info.plist and add two Keys:

Go to your Info.plist and add two Keys:

Solution 9 - Ios

in Swift 3.x:

override func viewWillAppear(_ animated: Bool) {
    UIApplication.shared.isStatusBarHidden = true
}


Solution 10 - Ios

So the issue here actually has nothing to do with Swift but just how status bar appearance is handled as of iOS 7.

By Default, view controllers individually control the appearance of the status bar when they are on the screen. If you want to use this method of controlling the status bar, you can override the following methods for whatever view controllers you'd like to modify the appearance for:

prefersStatusBarHidden, preferredStatusBarStyle, preferredStatusBarAnimation,

In your case, you would just implement prefersStatusBarHidden and return true.

The other way would be to control the status bar appearance at the application level. This seems to be what you're actually trying to do (by setting application.statusBarHidden).

In order to make this work, you need to open up your app's Info.plist file and add the key UIViewControllerBasedStatusBarAppearance, and give it a value of NO.

Solution 11 - Ios

Swift 5+

In my case, I need to update the status bar hidden based on some conditions.

Because of this, I create a base controlller BaseViewController which contains new property hideStatusBar.

Other view controllers are sub-class of this base controller. Finally when I want to update the status bar behavior, I only need to change this hideStatusBar value.

class BaseViewController: UIViewController {

    var hideStatusBar: Bool = false {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var prefersStatusBarHidden: Bool {
           return hideStatusBar
    }
}

How to use

final class ViewController: BaseViewController, UIScrollViewDelegate {
    let scrollView = UIScrollView()

    ...

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        UIView.animate(withDuration: 0.3) {
            if scrollView.contentOffset.y > 100 {
                self.hideStatusBar = true
            } else {
                self.hideStatusBar = false
            }
        }
    }
}

Demo

Here is a demo, I'm using UIView.animate(...) to make the transition smoother.

enter image description here

Solution 12 - Ios

I actually figured this out myself. I'll add my solution as another option.

extension UIViewController {
    func prefersStatusBarHidden() -> Bool {
        return true
    }
}

Solution 13 - Ios

Okay, so this become a problem for me since iOS 9 doesn't support any above the method people have mentioned here such as UIApplication.sharedApplication().statusBarHidden = true or

UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: UIStatusBarAnimation.None)

and

override func prefersStatusBarHidden() -> Bool {
     return true
}

works but does not provide programable solution where I can change on a condition. (statusBarHidden = true and statusBarHidden = false as we have done before).

Solution to this madness:

By adding to prefersStatusBarHidden() like below you can programmatically control the hide and show of status bar without adding UIViewControllerBasedStatusBarAppearance setting to your info.plist:

var showStatusBar = true

override func prefersStatusBarHidden() -> Bool {
     if showStatusBar {
         return false
     }
     return true
}

private func showStatusBar(enabled: Bool) {
    showStatusBar = enabled
    prefersStatusBarHidden()
}

then use it like this throughout your code:

//Hide Status Bar
showStatusBar(false)

OR

//Show Status Bar
showStatusBar(true)

Solution 14 - Ios

Just to add, when overriding prefersStatusBarHidden method or variable, the View controller-based status bar appearance in Info.plist must be YES, otherwise the override will have no effect

Solution 15 - Ios

in Swift 4.2 it is a property now.

override var prefersStatusBarHidden: Bool {
    return true
}

Solution 16 - Ios

In my case, I was looking for the status bar to hide/show on demand; instead of just when the view loads or disappears.

swift 3.x

//show status bar initially
var showStatusBar = true

//set the parameters
override var prefersStatusBarHidden: Bool {
    
    if showStatusBar == true {
        
        //does not prefer status bar hidden
        print("does not prefer status bar hidden")
        return false
        
    } else {
        
        //does prefer status bar hidden
        print("does prefer status bar hidden")
    return true
        
    }
}

//ex: hide status bar and call parameter function again whenever you want
        showStatusBar = false
        setNeedsStatusBarAppearanceUpdate()


            

Solution 17 - Ios

For Swift 4+ try the following code (tested on Swift 4.0, 4.1 - IOS 10, 11) :

override var prefersStatusBarHidden: Bool { return true }

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    // call this func to force preferredStatusBarStyle to be read again.
    setNeedsStatusBarAppearanceUpdate()
}

Solution 18 - Ios

Swift 5: In the main view controller, or main navigation controller if you have,

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    override var prefersStatusBarHidden: Bool {
        return false
    }

And "View controller-based status bar appearance" in plist must be YES, otherwise the above code will not be called.

If you want to hide status bar when launching app, "Status bar is initially hidden" in plist must be YES. This can prevent launch image from being distorted when extra blue bar showing on screen top.

Solution 19 - Ios

Updated for iOS 13 and Swift 5

If none of the above answers work for you. Check your plist to see if you have this:

"View controller-based status bar appearance"

If so, be sure to set it to YES!!!!!

Then the following code will work.

override var prefersStatusBarHidden: Bool {
    return true
}

Solution 20 - Ios

A solution that works for me; if you want to hide the status bar on a specific view controller while loading:

import UIKit

class ViewController: UIViewController {

private var hideStatusBar: Bool = false

override var prefersStatusBarHidden: Bool {
    return hideStatusBar
}

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
    return UIStatusBarAnimation.slide
}

override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundcolor = .white
    hideStatusBar = true
    
    UIView.animate(withDuration: 0.3) {
        self.setNeedsStatusBarAppearanceUpdate()
    }
}

Attention: if you set the key "View controller-based status bar appearance" to "NO" in your info.plist the code above doesn't work. You should set the key to "YES" or remove it from info.plist

Solution 21 - Ios

In your project General->Deployment Info->Status bar style select check mark of Hide status bar Note:- it hides status bar throughout application

Solution 22 - Ios

I'm using Xcode 8.1 (8B62) with a deployment target set to 10.1 and I haven't had much luck with the override options mentioned above. However checking the "Hide status bar" option in Deployment Info did the trick for me.

Project > General

I hope this helps.

Solution 23 - Ios

If you are presenting the view controller modally, try

viewController.hidesBottomBarWhenPushed = true
viewController.modalPresentationCapturesStatusBarAppearance = true

Solution 24 - Ios

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

Solution 25 - Ios

You can use this code in your ViewController Class scope

open override var prefersStatusBarHidden: Bool { return true }

Solution 26 - Ios

In your Project->General->Deployment info

Statusbar Style:--

just marked Hide status Bar(iOS 10)

Solution 27 - Ios

Swift 4

//MARK:- Show Status Bar
UIApplication.shared.isStatusBarHidden = false

//MARK:- Hide Status Bar
UIApplication.shared.isStatusBarHidden = true

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
QuestionJayView Question on Stackoverflow
Solution 1 - IosdrewagView Answer on Stackoverflow
Solution 2 - IosnycdanieView Answer on Stackoverflow
Solution 3 - IosJoseph MarkView Answer on Stackoverflow
Solution 4 - IosVincent JoyView Answer on Stackoverflow
Solution 5 - IosMiladiuMView Answer on Stackoverflow
Solution 6 - IosatlwxView Answer on Stackoverflow
Solution 7 - IosMohit TomarView Answer on Stackoverflow
Solution 8 - IosjanazView Answer on Stackoverflow
Solution 9 - IosSamiraView Answer on Stackoverflow
Solution 10 - IosDimaView Answer on Stackoverflow
Solution 11 - Iosnahung89View Answer on Stackoverflow
Solution 12 - IosJayView Answer on Stackoverflow
Solution 13 - IosCodeOverRideView Answer on Stackoverflow
Solution 14 - IosHuanyanView Answer on Stackoverflow
Solution 15 - IosRawand SaeedView Answer on Stackoverflow
Solution 16 - IosFelecia GenetView Answer on Stackoverflow
Solution 17 - IosCoder ACJHPView Answer on Stackoverflow
Solution 18 - IosSam XuView Answer on Stackoverflow
Solution 19 - IosLegolas WangView Answer on Stackoverflow
Solution 20 - Iosandre_holdView Answer on Stackoverflow
Solution 21 - IosSweta VaniView Answer on Stackoverflow
Solution 22 - IosdanmerfeldView Answer on Stackoverflow
Solution 23 - IosYannStephView Answer on Stackoverflow
Solution 24 - IosPrasad BulbuleView Answer on Stackoverflow
Solution 25 - IosSajjadView Answer on Stackoverflow
Solution 26 - IosV D PurohitView Answer on Stackoverflow
Solution 27 - IosShakeel AhmedView Answer on Stackoverflow