【问题标题】:How to hide iOS status bar如何隐藏iOS状态栏
【发布时间】:2013-09-29 13:32:57
【问题描述】:

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

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

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

例如:

-(BOOL)prefersStatusBarHidden { return YES; }

效果很好,但我无法在父视图控制器中再次显示状态栏。

【问题讨论】:

标签: ios7 show-hide statusbar


【解决方案1】:

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

【讨论】:

  • 供参考,原始密钥为UIViewControllerBasedStatusBarAppearance
  • @Rajneesh071 如果我想为工作设置 PreferredStatusBarStyle 我需要做什么,我需要"View controller-based status bar appearance" set it to "YES".
  • 您遇到了什么问题?
  • 似乎已弃用,会破坏您的应用
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    在 viewdidload 中添加以下行

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

    并添加新方法

      - (BOOL)prefersStatusBarHidden {
              return YES;
      }
    

    同时更改 info.plist 文件 查看基于控制器的状态栏外观" = NO

    它对我有用

    【讨论】:

    • 感谢这个为我工作,但我还需要在 plist 中添加下面的行。 "View controller-based status bar appearance" = NO i,e 在 vi​​ewdidload [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade] 中添加以下行并添加新方法 - (BOOL)prefersStatusBarHidden { return YES;在 Plist 文件中添加“查看基于控制器的状态栏外观”=NO
    • prefersStatusBarHidden 是我的诀窍(无论是这个解决方案还是其他类似的解决方案)
    【解决方案4】:

    在 Plist 中添加以下属性。

    Status bar is initially hidden = YES
    
    View controller-based status bar appearance = NO
    

    现在状态栏将隐藏。

    【讨论】:

    • 原始键是 UIStatusBarHidden 和 UIViewControllerBasedStatusBarAppearance
    【解决方案5】:

    试试这个简单的方法:


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

    【讨论】:

    • 这是一个绝妙的答案!也可以尝试各种UIStatusBarAnimations,它们非常棒。
    • 别忘了[super viewWillAppear:animated][super viewWillDisappear:animated]
    • 这个简单的解决方案适用于 iOS 10。做一个简单的人!
    • 'setStatusBarHidden:withAnimation:' 已弃用:在 iOS 9.0 中首次弃用 - 使用 -[UIViewController prefersStatusBarHidden]
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:
      • UIApplication.setStatusBarX 自 iOS9 起已弃用
      • 不推荐在 info.plist 中包含 UIViewControllerBasedStatusBarAppearance=NO
      • 所以我们应该在所有视图控制器中使用 preferredStatusBarX

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

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

      【讨论】:

      • 为什么苹果不能只听从一条建议?如果它没有损坏,请不要修复它!
      【解决方案8】:

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

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

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

         View-Controller Based Status Bar Appearance = NO
        

      【讨论】:

        【解决方案9】:

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

        任何更改之前的应用

        在名为 Supporting FilesProject Navigator 文件夹中找到并单击 *.plist 文件

        之后,您将获得应用的不同设置。您需要添加 2 个密钥 UIStatusBarHiddenUIViewControllerBasedStatusBarAppearance。您只需单击 + 按钮即可完成此操作

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

        正确版本:

        最后应用此更改后的应用程序:

        另外,您可以找到替代解决方案here

        【讨论】:

          【解决方案10】:

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

          override var prefersStatusBarHidden: Bool {
              return true
          }
          

          【讨论】:

            【解决方案11】:

            斯威夫特 5

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

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

            最终设置截图:

            这适用于 Xcode 10.2

            【讨论】:

            • 这对我有用,即使在使用 swiftui 时(当 .statusbar 修饰符什么都不做时)
            【解决方案12】:

            试试看;

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

            【讨论】:

            • 太棒了。我可以使用它来隐藏视图控制器上不需要的状态栏,然后在用户登录后取消隐藏它。
            【解决方案13】:

            在 iOS7 中隐藏你的状态栏:

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

            【讨论】:

              【解决方案14】:

              这里是 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 时返回您的类。一种方法是为statusController 提供一个公共弱变量,并在此覆盖的方法中返回它。

              【讨论】:

              • iOS8 中不推荐使用顶部块 - 使用第二种方法。谢谢!我编辑了代码以添加另一个强制调用。
              【解决方案15】:

              iOS 9 及以上版本:

              由于statusBarHidden 方法已从iOS9 弃用,您需要在 plist 中添加两个值,如下所示:

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

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

              statusBarHiddeniOS9已弃用

              @property(readwrite, nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden NS_已弃用_IOS(2_0, 9_0, "使用 -[UIViewController prefersStatusBarHidden]") __TVOS_PROHIBITED;

              【讨论】:

                【解决方案16】:

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

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

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

                 private var isStatusBarHidden = true {
                        didSet {
                            setNeedsStatusBarAppearanceUpdate()
                        }
                    }
                
                    override var prefersStatusBarHidden: Bool {
                        return isStatusBarHidden
                    }
                

                你可以拨打isStatusBarHidden = trueisStatusBarHidden = falsehide/show状态栏

                【讨论】:

                  【解决方案17】:

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

                  【讨论】:

                    【解决方案18】:

                    在 iOS 中隐藏状态栏的步骤
                    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 appearance设置NO

                    【讨论】:

                      【解决方案19】:

                      来自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 appearance设置为NO

                      【讨论】:

                        【解决方案20】:

                        要回答 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。通过再次调用来间接调用 preferStatusBarHidden

                        [self setNeedsStatusBarAppearanceUpdate]
                        

                        【讨论】:

                          【解决方案21】:

                          Swift 3 更新:

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

                          View controller-based status bar appearance: NO

                          然后,在 ViewController 或其他地方:

                          UIApplication.shared.isStatusBarHidden = true

                          【讨论】:

                            猜你喜欢
                            • 2017-03-20
                            • 1970-01-01
                            • 2012-09-21
                            • 2013-11-18
                            • 2014-04-14
                            • 1970-01-01
                            • 2013-09-20
                            • 2015-04-21
                            相关资源
                            最近更新 更多