如何隐藏iOS状态栏


219

在我的iOS视频应用中,某些视图控制器中隐藏了状态栏。我使用以下代码完成了此操作。

[[UIApplication sharedApplication] setStatusBarHidden:YES];
  • 它适用于iOS 5和iOS 6,但不适用于iOS 7。

  • 我尝试了这个特别的视图控制器,

例如:

-(BOOL)prefersStatusBarHidden { return YES; }

它工作正常,但是我无法在父视图控制器中再次显示状态栏。



1
如果在情节提要中设置了状态栏样式,则在更改“基于View Controller的状态栏”(如下)之后,可能必须在plist中设置样式,因为将不再使用视图控制器设置。stackoverflow.com/questions/18924345/…–
马特

1
我回答了另一个问题。试试这个。[以编程方式隐藏状态栏的最简单方法] [1] [1]:stackoverflow.com/a/27339754/3718498
wataru 2014年

1
我使用了一个技巧–我将其发布为pod cocoapods.org/pods/UIViewController+ODStatusBar,希望对任何人
都有

现在已弃用这里的答案。我已经很难找到正确答案为iOS 9隐藏状态栏时,对于刚刚推出的屏幕,因此链接的下方,它是希望他人更容易找到如何做到这一点:stackoverflow.com/questions/34413848/...

Answers:


277

您应该将此值添加到plist:“ 基于视图控制器的状态栏外观 ”,并将其设置为“ NO ”。

enter image description here


40
作为参考,原始密钥是UIViewControllerBasedStatusBarAppearance
William Denniss

1
@ Rajneesh071如果我想为我需要的工作设置preferredStatusBarStyle,该"View controller-based status bar appearance" set it to "YES".怎么办?
Bimawa 2014年


您面对什么问题?
Rajneesh071 2014年

似乎已弃用,将会破坏您的应用程序
2015年

194

将以下内容添加到您的Info.plist中:

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

Image


在Xcode 11.3,iOS 13中运行出色
Wayne Henderson

113

在viewdidload中添加以下行

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

并添加新方法

  - (BOOL)prefersStatusBarHidden {
          return YES;
  }

也更改info.plist文件,查看基于控制器的状态栏外观” =否

对我有用


谢谢这个为我工作,但我也需要在plist的下面添加一行。“基于视图控制器的状态栏外观” =否i,e在viewdidload [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]中添加以下行:并添加新方法-(BOOL)prefersStatusBarHidden {return YES; }在Plist文件中添加“基于视图控制器的状态栏外观” = NO
sandy

prefersStatusBarHidden对我来说是什么窍门(以及与其他类似解决方案的结合)
Abdo 2015年

34

在Plist中添加以下属性。

Status bar is initially hidden = YES

View controller-based status bar appearance = NO

现在状态栏将隐藏。


8
原始键为UIStatusBarHidden和UIViewControllerBasedStatusBarAppearance
leolobato 2013年

27

试试这个简单的方法:


目标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];
}

迅速:

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)
}

1
这是一个很棒的答案!还可以尝试各种UIStatusBarAnimations,它们非常棒。
VedTopkar

不要忘了[super viewWillAppear:animated][super viewWillDisappear:animated]
桑布

1
这个简单的解决方案适用于我iOS10。变得简单!
coolcool1994'1

14

我做了以下事情,它似乎可以工作(即使在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;
}

12
  • 从iOS9开始不推荐使用UIApplication.setStatusBarX
  • 不建议在info.plist中使用UIViewControllerBasedStatusBarAppearance = NO
  • 因此,我们应该在所有视图控制器中使用preferredStatusBarX

但是,当涉及到UINavigationController时,它将变得更加有趣:

  • 如果navigationBarHidden = true,则将调用子UIViewController的preferredStatusBarX,因为该子项将在状态栏下显示内容。
  • 如果navigationBarHidden = false,则在状态栏下显示内容之后,将调用UINavigationController的preferredStatusBarX。
  • UINavigationController的默认preferredStatusBarStyle使用UINav.navigationBar.barStyle中的值。.Default =黑色状态栏内容,.Black =白色状态栏内容。
  • 因此,如果将barTintColor设置为某些自定义颜色(可能是这样),则还需要将barStyle设置为.Black以获得白色状态栏内容。我将在设置barTintColor之前将barStyle设置为黑色,以防barStyle覆盖barTintColor。
  • 另一种选择是,您可以继承UINavigationController的子类,而不用随意处理栏样式。
  • 但是,如果将UINavigationController子类化,则如果navigationBarHidden = true,则无法控制状态栏。在这种情况下,UIKit会以某种方式直接转到子UIViewController,而无需询问UINavigationController。我本以为问孩子>耸肩<应该是UINavigationController的责任。
  • 如果modalPresentationStyle = .FullScreen,则模态显示的UIViewController仅在状态栏中有发言权。
  • 如果您有一个自定义的呈现样式模态视图控制器,并且确实希望它控制状态栏,则可以设置modalPresentationCapturesStatusBarAppearance = true。

苹果为什么不能只听一听建议?如果没有损坏,请不要修复!
Jargen89 '16

9

要在iOS7中隐藏状态栏,您需要2行代码

  1. 在应用程序中:(UIApplication *)应用程序didFinishLaunchingWithOptions:(NSDictionary *)launchOptions写

     [[UIApplication sharedApplication] setStatusBarHidden:YES];
    
  2. 在info.plist中添加此

     View-Controller Based Status Bar Appearance = NO
    

8

为了更好地理解,请添加一些带有注释的照片:

更改前的应用

在此处输入图片说明

Project Navigator名为您的文件夹中找到Supporting Files并单击* .plist文件

在此处输入图片说明

之后,将显示不同的应用程序设置。您需要添加2个键UIStatusBarHiddenUIViewControllerBasedStatusBarAppearance。您只需单击+按钮即可

在此处输入图片说明

按+后,您可以选择其中一个键-只需开始输入即可。

正确版本:

在此处输入图片说明

最后应用以下更改后的应用程序:

在此处输入图片说明

另外,您可以在此处找到替代解决方案


8

在iOS10中,我要做的就是prefersStatusBarHidden在我的RootViewController(Swift)中覆盖var :

override var prefersStatusBarHidden: Bool {
    return true
}


5

要在iOS7中隐藏状态栏:

打开您的plist文件,然后添加一个名为“基于视图控制器的状态栏外观”的行,并将其值设置为NO


5

这是Swift版本(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)
}

这也适用(iOS7 +):

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

您还需要致电:

setNeedsStatusBarAppearanceUpdate()

在说viewDidLoad()

请注意,如果您使用SplitView控制器或其他container视图控制器,则还需要让它在发送类时返回您的类childViewControllerForStatusBarHidden。实现此目的的一种方法是使用一个公共的弱var例如say statusController,并以此重写的方法将其返回。


1
iOS8中不推荐使用顶部块-使用第二种方法。谢谢!我编辑了代码以添加另一个强制性呼叫。
David H

5

iOS 9以上版本:

由于statusBarHidden方法已过时iOS9 您需要添加在plist中两个值如下:

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

或通过用户界面,请参考下图:

在此处输入图片说明

由于statusBarHidden弃用iOS9

@property(readwrite,nonatomic,getter = isStatusBarHidden)BOOL statusBarHidden NS_ DEPRECATED _IOS(2_0,9_0,“使用-[UIViewController优先于StatususBarHidden]”))__TVOS_PROHIBITED;


5

SWIFT 3+(iOS 9,10)的固定解决方案

1-在info.plist中设置以下属性

在此处输入图片说明

2-将以下代码粘贴到根控制器,到

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

    override var prefersStatusBarHidden: Bool {
        return isStatusBarHidden
    }

您可以致电isStatusBarHidden = true以及isStatusBarHidden = false您想进入的hide/show状态栏


4

您应该将此值添加到plist:“基于视图控制器的状态栏外观”,并将其设置为“ NO”。


4

在iOS
1中隐藏状态栏的步骤 1.打开AppDelegate.m文件,在didFinishLaunchingWithOptions方法中添加application.statusBarHidden

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    application.statusBarHidden = YES;
    return YES;
    }
  1. 打开info.plist 并设置

View controller-based status bar appearanceNO


4

迅捷5

使用以下步骤隐藏iOS状态栏:

  1. 在Info.plist上打开。
  2. 添加新的基于View控制器的状态栏外观,并将其值设置为NO
  3. 添加新键状态栏最初处于隐藏状态,值设置为YES
  4. 重新编译项目。
  5. 状态栏现在应该在iOS手机上隐藏了。

最终设置屏幕截图:

最终设定

这适用于Xcode 10.2


2

来自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);

所以应该设为View controller-based status bar appearanceNO


2

要回答Susitha的问题:使用setNeedsStatusBarAppearanceUpdate。这将调用prefersStatusBarHidden刷新您所需的状态栏状态。试试这个:

    @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];
    }

如果要再次查看状态栏,请将属性hideStatusBar(或任何您称呼的)设置为NO。通过再次调用来间接调用preferredStatusBarHidden

[self setNeedsStatusBarAppearanceUpdate]

1

Swift 3更新:

使用以下信息更新Info.plist:

View controller-based status bar appearance: NO

然后,在ViewController或其他地方:

UIApplication.shared.isStatusBarHidden = true

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.