ChatGPT解决这个技术问题 Extra ChatGPT

How to hide iOS status bar

In my iOS video app status bar is hidden in some view controllers. I have done this using following code.

[[UIApplication sharedApplication] setStatusBarHidden:YES];

It works for iOS 5 and iOS 6 , but not in iOS 7.

I tried with this in particular view controller,

Eg:

-(BOOL)prefersStatusBarHidden { return YES; }

It works well, but I cant show status bar again in the parent view controller.

If the status bar style is set in the Storyboard, after changing the "View controller-based status bar" (below), the style may have to be set in the plist because the view controller setting will no longer be used. stackoverflow.com/questions/18924345/…
I answered in another question. Try this. [ the easiest way to hide status bar programmatically][1] [1]: stackoverflow.com/a/27339754/3718498
I used a trick for it – I published it as pod cocoapods.org/pods/UIViewController+ODStatusBar, I hope it will be useful for anyone
The answers here have now been deprecated. I had trouble finding the correct answer for iOS 9 when hiding the status bar FOR JUST THE LAUNCH SCREEN, so linking below so it's hopefully easier for others to find how to do that: stackoverflow.com/questions/34413848/…

R
Rajneesh071

You should add this value to plist: "View controller-based status bar appearance" and set it to "NO".

https://i.stack.imgur.com/H75kH.png


For reference, raw key is UIViewControllerBasedStatusBarAppearance
@Rajneesh071 What i need do if i want set preferredStatusBarStyle for work it i need "View controller-based status bar appearance" set it to "YES". ?
what issue are you facing?
seems deprecated, will breaks your app
S
Shekhar Gupta

Add the following to your Info.plist:

<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

https://i.stack.imgur.com/PpFl3.png


C
Community

Add following line in viewdidload

  [[UIApplication sharedApplication] setStatusBarHidden:YES
                                        withAnimation:UIStatusBarAnimationFade];

and add new method

  - (BOOL)prefersStatusBarHidden {
          return YES;
  }

also change info.plist file View controller-based status bar appearance" = NO

its works for me


Thanx this one working for me but I need to add below row in plist also. "View controller-based status bar appearance" = NO i,e Add following line in viewdidload [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]; and add new method - (BOOL)prefersStatusBarHidden { return YES; } Add "View controller-based status bar appearance" = NO in Plist file
prefersStatusBarHidden is what did the trick for me (whether with this solution of with other similar ones)
G
Gurumoorthy Arumugam

In the Plist add the following properties.

Status bar is initially hidden = YES

View controller-based status bar appearance = NO

now the status bar will hidden.


Raw keys would be UIStatusBarHidden and UIViewControllerBasedStatusBarAppearance
R
Rajesh Loganathan

Try this simple method:

Objective-C:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated]
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated]
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
}

Swift:

override func viewWillAppear(animated: Bool) 
{
    super.viewWillAppear(animated)
    UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: UIStatusBarAnimation.None)
}

override func viewWillDisappear(animated: Bool) 
{
    super.viewWillDisappear(animated)
    UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: UIStatusBarAnimation.None)
}

This was a wonderful answer! Also try it with the various UIStatusBarAnimations, they're pretty great.
Don't forget [super viewWillAppear:animated] and [super viewWillDisappear:animated]
This simple solution worked for me iOS 10. Way to be simple man!
'setStatusBarHidden:withAnimation:' is deprecated: first deprecated in iOS 9.0 - Use -[UIViewController prefersStatusBarHidden]
s
smartbot

I did the following and it seems to work (even in iOS 8):

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {

        [[UIApplication sharedApplication] setStatusBarHidden:YES];
    }
}

- (BOOL)prefersStatusBarHidden {
    return YES;
}

C
Chris

UIApplication.setStatusBarX are deprecated as of iOS9

It's deprecated to have UIViewControllerBasedStatusBarAppearance=NO in your info.plist

So we should be using preferredStatusBarX in all our view controllers

But it gets more interesting when there's a UINavigationController involved:

If navigationBarHidden = true, the child UIViewController's preferredStatusBarX are called, since the child is displaying the content under the status bar.

If navigationBarHidden = false, the UINavigationController's preferredStatusBarX are called, after all it is displaying the content under the status bar.

The UINavigationController's default preferredStatusBarStyle uses the value from UINav.navigationBar.barStyle. .Default = black status bar content, .Black = white status bar content.

So if you're setting barTintColor to some custom colour (which you likely are), you also need to set barStyle to .Black to get white status bar content. I'd set barStyle to black before setting barTintColor, in case barStyle overrides the barTintColor.

An alternative is that you can subclass UINavigationController rather than mucking around with bar style.

HOWEVER, if you subclass UINavigationController, you get no control over the status bar if navigationBarHidden = true. Somehow UIKit goes direct to the child UIViewController without asking the UINavigationController in this situation. I would have thought it should be the UINavigationController's responsibility to ask the child >shrugs<.

And modally displayed UIViewController's only get a say in the status bar if modalPresentationStyle = .FullScreen.

If you've got a custom presentation style modal view controller and you really want it to control the status bar, you can set modalPresentationCapturesStatusBarAppearance = true.


Why can't apple just follow one piece of advice? If it isn't broken, don't fix it!
S
Shaik Riyaz

To hide status bar in iOS7 you need 2 lines of code

in application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions write [[UIApplication sharedApplication] setStatusBarHidden:YES]; in info.plist add this View-Controller Based Status Bar Appearance = NO


h
hbk

For better understanding add some photos with comments:

App before any changes

https://i.stack.imgur.com/NRlWJ.png

Found in your Project Navigator folder named Supporting Files and click on *.plist file

https://i.stack.imgur.com/Yg0B2.png

After you will get different setting of your app showed. You need to add 2 keys UIStatusBarHidden and UIViewControllerBasedStatusBarAppearance. You can do this simply clicking on + button

https://i.stack.imgur.com/yC3rh.png

After pressing + you can choose one of the key - just start to type.

Correct version:

https://i.stack.imgur.com/hrlze.png

And finally application after applying this changes:

https://i.stack.imgur.com/WQv1g.png

Also, you can find alternative solution here


a
andrewz

In iOS10 all I needed to do is override the prefersStatusBarHidden var in my RootViewController (Swift):

override var prefersStatusBarHidden: Bool {
    return true
}

J
Jerry Chong

Swift 5

Use following steps to hide iOS Status Bar:

Open on Info.plist. Add new key View controller-based status bar appearance and value set to NO. Add new key Status bar is initially hidden and value set to YES. Re-compile project. Status bar should hidden on iOS phone now.

Final Settings Screenshot:

https://i.stack.imgur.com/u2HIi.png

This is working on Xcode 10.2


this worked for me even when using swiftui (when .statusbar modifier did nothing)
K
Kemal Can Kaynak

Try that;

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];

Great. I was able to use this to hide the status bar on the view controller it wasn't needed on then unhide it once the user logged in.
K
Ketan P

iOS 9 onwards :

As statusBarHidden method was Deprecated from iOS9 you need to add two values in plist as below :

<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

or by User Interface Please refre below image :

https://i.stack.imgur.com/sFU1R.png

As statusBarHidden is Deprecated from iOS9 :

@property(readwrite, nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController prefersStatusBarHidden]") __TVOS_PROHIBITED;


k
katzenhut

To hide your status bar in iOS7:

Open Your plist-file, then add a add a row called "View controller-based status bar appearance" and set its value to NO.


D
David H

Here is the Swift version (pre iOS9):

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: UIStatusBarAnimation.None)
}

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: UIStatusBarAnimation.None)
}

This also works (iOS7+):

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

You also need to call:

setNeedsStatusBarAppearanceUpdate()

in say viewDidLoad().

Note that if you use a SplitView controller, or some other container view controller, you also need to have it return your class when its sent childViewControllerForStatusBarHidden. One way to do this is have a public weak var for say statusController, and return it in this overridden method.


The top block is deprecated in iOS8 - use your second approach. And thanks! I edited the code to add another mandatory call.
M
MANISH PATHAK

FIXED SOLUTION FOR SWIFT 3+ (iOS 9, 10)

1- In info.plist set below property

https://i.stack.imgur.com/f56qR.png

2- Paste below code to Root controller , To

 private var isStatusBarHidden = true {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var prefersStatusBarHidden: Bool {
        return isStatusBarHidden
    }

You can call isStatusBarHidden = true and isStatusBarHidden = false where you want to hide/show status bar


b
bLacK hoLE

You should add this value to plist: "View controller-based status bar appearance" and set it to "NO".


A
Ashu

Steps for hide status bar in iOS 1. open AppDelegate.m file, add application.statusBarHidden in didFinishLaunchingWithOptions method

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    application.statusBarHidden = YES;
    return YES;
    }

open info.plist and set

View controller-based status bar appearance set NO


T
Tony

From UIKit>UIApplication.h:

// Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system.
@property(nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden;
- (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation NS_AVAILABLE_IOS(3_2);

So should set View controller-based status bar appearance to NO


S
SmileBot

To answer the Susitha's question: use setNeedsStatusBarAppearanceUpdate. This will make a call to prefersStatusBarHidden to refresh with your desired status bar state. Try this:

    @property (nonatomic, getter=isHideStatusBar) BOOL hideStatusBar; // Give this a default value early

    - (BOOL)prefersStatusBarHidden {
        return self.isHideStatusBar;
    }

    - (void)someMethod {
    // triggered by an event or user action
    [self setHideStatusBar:YES];
    [self setNeedsStatusBarAppearanceUpdate];
    }

If you want to see the status bar again, set your property hideStatusBar (or whatever you call it) to NO. Call preferStatusBarHidden indirectly by making another call to

[self setNeedsStatusBarAppearanceUpdate]

P
Prazgaitis

Update for Swift 3:

Update Info.plist with the following info:

View controller-based status bar appearance: NO

Then, in a ViewController or elsewhere:

UIApplication.shared.isStatusBarHidden = true