【问题标题】:Cannot hide status bar in iOS7iOS7 无法隐藏状态栏
【发布时间】:2013-08-06 06:01:33
【问题描述】:

我刚刚将我的 iPhone 5 iOS 7 升级到了四个 beta 版本。现在,当我在这台 iPhone 上从 Xcode 5 运行我的应用程序时,状态栏并没有隐藏,即使它应该隐藏。

不工作:

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

不工作:

[UIApplication sharedApplication].statusBarHidden = YES;

无法登录 Apple 开发者论坛

【问题讨论】:

  • 不真实,我的回答涉及 Xcode,并且已向公众展示。说“如果你回答这个问题,那就是违反 NDA”太笼统了.. 让开发人员自己决定;-)
  • Status bar won't disappear 的可能重复项
  • 如何以编程方式隐藏状态栏特定的 ViewController ?

标签: objective-c statusbar ios7


【解决方案1】:

在您的应用程序 plist 文件中添加一行,将其命名为“基于控制器的状态栏外观”并将其设置为 NO

请注意,如果您在应用程序中使用 UIImagePickerController,这根本不起作用。

来自http://www.openfl.org/developer/forums/general-discussion/iphone-5ios-7-cant-hide-status-bar/,mgiroux 的解决方案

【讨论】:

  • 太棒了!我在这个上浪费了几个小时!谢谢!
  • 供参考,实际Info.plist文件中存储的原始值称为UIViewControllerBasedStatusBarAppearance
  • 这种方法的唯一问题是,如果您使用 UIImagePickerController 选择图像,它将强制状态栏再次出现。防止这种情况的唯一可靠方法是在每个方法中实现 prefersStatusBarHidden 方法您的视图控制器并将 UIViewControllerBasedStatusBarAppearance plist 设置重置为 true。
  • 我真的不知道为什么苹果改变了这一点!谢谢:)
  • 您还需要将Status bar is initially hidden 设置为YES
【解决方案2】:

在视图控制器中添加方法。

- (BOOL)prefersStatusBarHidden {
    return YES;
}

【讨论】:

  • 对于所有正在寻找的人,如果您想在某些视图中动态删除状态栏,这就是这样做的方法。无论您在 plist 中将“基于控制器的状态栏外观”设置为什么,此方法都有效!
  • +1 b/c 我正在寻找动态显示/隐藏状态栏的能力。然而,P-list 设置方法(参见上面@Satgi 的帖子)是全局显示/隐藏状态栏的最佳方法。
  • 如果您在某个地方有一个照片库,您通常只想将控件隐藏在那里,您也可以打开/关闭它。这对我不起作用,甚至没有调用该函数。我在同一个地方有一个 preferredStatusBarStyle 并且被称为
  • @Mr.T 在 iOS 8 中,情况似乎不再如此。如果您已将基于视图控制器的状态栏外观设置为 NO 并在视图控制器中从 prefersStatusBarHidden 返回 true,则它将不起作用。状态栏仍然出现。
  • @Isuru 为什么你设置为 NO?如果您设置为 YES,它会询问每个视图控制器,在其他情况下当然不会。
【解决方案3】:

在 Plist 中添加以下属性。

->Status bar is initially hidden = 是

-> View controller-based status bar appearance = 否

添加两者 - 现在状态栏将消失。

【讨论】:

  • 是的,这对我也有用。如果不将“状态栏最初隐藏”选项设置为“是”,它不会按预期工作。谢谢。
【解决方案4】:

要在单个视图上隐藏状态栏,您应该使用:

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

起初,这对我不起作用,然后在此方法的文档中看到说: // 如果您的应用程序使用默认的基于 UIViewController 的状态栏系统,则设置 statusBarHidden 没有任何作用。

这必须在 plist 文件上完成,将密钥 View controller-based status bar appearance 添加到 NO。 然后就成功了。

【讨论】:

    【解决方案5】:

    为了使用旧的 UIApplication 方法隐藏/显示状态栏,您的应用必须为 iOS 7 设置 plist 值:

    View-Controller Based Status Bar Appearance = NO

    此值默认设置为 YES。如果将其更改为 NO,则可以使用旧方法。如果您将其设置为 YES,您仍然可以隐藏状态栏,但由您的应用程序中的每个视图控制器子类来覆盖:prefersStatusBarHidden 返回 YES。

    任何时候您的应用需要更改状态栏外观或可见性,并且基于视图控制器的状态栏外观设置为 YES,您的最外层视图控制器需要调用:

    setNeedsStatusBarAppearanceUpdateAnimation

    【讨论】:

    • 我不得不申请自定义 iOS 目标属性,因为在一般 plist 中不起作用
    【解决方案6】:

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

    1. inapplication:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

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

      View-Controller Based Status Bar Appearance = NO
      

    【讨论】:

    • 只是为了清理它,如果你把它放在 didFinishLaunching 里面,你可以写 [application setStatusBarHidden:YES];application.statusBarHidden = YES;
    • 上面的答案可能有错别字。 “基于视图控制器的状态栏外观 = NO”对我不起作用,但“基于视图控制器的状态栏外观 = NO”确实有效。
    【解决方案7】:

    这个问题有很多组合建议,但问题是 iOS 6 和 7 使用不同的方法来隐藏状态栏。我从未成功设置 plist 设置以在 iOS 7 上启用 iOS6 样式的行为,但如果您正在构建应用程序以支持 iOS 6+,则需要同时使用 3 种方法来确保特定视图控制器隐藏状态酒吧:

    // for ios 7 
    - (BOOL)prefersStatusBarHidden{
        return YES;
    }
    
    // for ios 6
    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        [[UIApplication sharedApplication] setStatusBarHidden:YES];
    }
    - (void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
        // explicitly set the bar to show or it will remain hidden for other view controllers
        [[UIApplication sharedApplication] setStatusBarHidden:NO];
    }
    

    无论您的 plist 设置如何,这都应该有效。

    【讨论】:

      【解决方案8】:

      我必须在下面进行两项更改才能隐藏状态栏:

      将此代码添加到要隐藏状态栏的视图控制器中:

      - (BOOL)prefersStatusBarHidden
      {
          return YES;
      }
      

      将此添加到您的 .plist 文件中(转到应用程序设置中的“信息”)

      View controller-based status bar appearance --- NO
      

      然后你可以调用这行来隐藏状态栏:

      [[UIApplication sharedApplication] setStatusBarHidden:YES];
      

      【讨论】:

        【解决方案9】:

        只需在 info.plist 文件中添加这两行。它将修复 iOS7 和旧版本。

        • 状态栏最初是隐藏的 = YES
        • 查看基于控制器的状态栏外观 = 否

        导航到项目并选择 Targets -> General 并查看“状态栏样式...在应用程序启动期间隐藏”复选框将被选中。这将起作用。

        【讨论】:

          【解决方案10】:

          试试这个简单的方法:

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

          【讨论】:

            【解决方案11】:

            唯一对我有用的是在您的 plist 中添加以下内容

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

            【讨论】:

              【解决方案12】:

              我发现在整个应用程序中隐藏状态栏的最简单方法是在UIViewController 上创建category 并覆盖prefersStatusBarHidden。这样您就不必在每个视图控制器中都编写此方法。

              UIViewController+HideStatusBar.h

              #import <UIKit/UIKit.h>
              
              @interface UIViewController (HideStatusBar)
              
              @end
              

              UIViewController+HideStatusBar.m

              #import "UIViewController+HideStatusBar.h"
              
              @implementation UIViewController (HideStatusBar)
              
              //Pragma Marks suppress compiler warning in LLVM. 
              //Technically, you shouldn't override methods by using a category, 
              //but I feel that in this case it won't hurt so long as you truly 
              //want every view controller to hide the status bar. 
              //Other opinions on this are definitely welcome
              
              #pragma clang diagnostic push
              #pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
              
              - (BOOL)prefersStatusBarHidden
              {
                  return YES;
              }
              
              #pragma clang diagnostic pop
              
              
              @end
              

              【讨论】:

              • 最好的真实、iOS7、非伪造解决方案,很棒
              【解决方案13】:
              1. 在plist中添加----

                查看基于控制器的状态栏外观 --- 否

              2. 在每个viewController中写

                - (void) viewDidLayoutSubviews
                {
                    CGRect viewBounds = self.view.bounds;
                    CGFloat topBarOffset = 20.0;
                    viewBounds.origin.y = -topBarOffset;
                    self.view.bounds = viewBounds;
                
                    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];//for status bar style
                }
                

              针对 iOS 7 中的状态栏问题,但应用的目标应为 5.1 及更高版本

              【讨论】:

                【解决方案14】:

                此线程上的许多答案都有效,但我的理解是,如果您尝试做任何动态的事情,您最终需要调用:

                [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
                

                【讨论】:

                  【解决方案15】:

                  在 iOS 7 中隐藏状态栏的步骤:

                  1.转到您的应用程序 info.plist 文件。

                  2.And Set,查看基于控制器的状态栏外观:Boolean NO

                  希望我解决了状态栏问题.....

                  【讨论】:

                    【解决方案16】:

                    对于 iOS 7 在单个视图中使用 viewWillappear 方法:

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

                    为了显示状态栏使用:

                    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:NO];
                    

                    【讨论】:

                      【解决方案17】:
                      -(BOOL)prefersStatusBarHidden
                      {
                          return YES;
                      }
                      

                      【讨论】:

                        【解决方案18】:

                        在 Info Plist 文件中为以下属性添加一行

                        属性名称:查看基于控制器的状态栏外观

                        值:否

                        【讨论】:

                          【解决方案19】:

                          尝试将以下方法添加到应用的根视图控制器:

                          - (BOOL)prefersStatusBarHidden
                              {
                                  return YES;
                              }
                          

                          【讨论】:

                            【解决方案20】:

                            我尝试了在我的项目中发布的所有这些选项,但它们不起作用。我认为这可能与我更新了我的 Xcode 然后将应用程序更新到 iOS 7 并且某些设置在某个地方搞砸了有关。我决定为它构建一个全新的项目,然后简单地设置:“Status bar is initially hidden = YES”和“View controller-based status bar appearance = NO”,正如许多其他人所说的那样,它工作正常(即没有状态栏)。

                            因此,如果您正在处理已从旧版本更新到 iOS 7 并尝试了所有其他选项的项目,我的建议是构建一个新项目。

                            【讨论】:

                            • 我最初使用相同的技术来确认我可以为每个屏幕全局隐藏状态栏,但由于我的应用程序非常“以时间为中心”,我希望大多数屏幕都显示时间。由于各种原因,这只是我想排除它的一个屏幕。我最终使用了与您相反的参数:最初隐藏=NO & 基于 VC 的状态栏外观=YES。 然后我不得不将 (BOOL)prefersStatusBarHidden 方法(返回 YES)放入我想要隐藏它的一个 VC 中。效果很好。我应该补充一点,由于其他原因,我的应用程序仅适用于 iOS7。
                            【解决方案21】:

                            2019 年 ...

                            要制作一个没有状态栏的应用,

                            点击info.plist,右键“添加行”。

                            使用以下设置添加这两个:

                            仅此而已。

                            【讨论】:

                              【解决方案22】:

                              你可以查看这个code,豆荚UIViewController+ODStatusBar

                              【讨论】:

                                【解决方案23】:

                                适用于 Swift 2.0+ IOS 9

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

                                【讨论】:

                                  【解决方案24】:

                                  隐藏特定viewController的状态栏

                                  - (BOOL)prefersStatusBarHidden {
                                      return YES;
                                  }
                                  

                                  设置状态栏隐藏应用:

                                  • 在.plist 中设置View controller-based status bar appearancetoNOapplication: didFinishLaunchingWithOptions: 中设置: [application setStatusBarHidden:YES];

                                    注意:setStatusBarHidden:已弃用

                                  • 在项目设置 -> 常规选项卡 ->部署信息

                                    勾选Hide Status bar框。

                                  【讨论】:

                                    【解决方案25】:
                                    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
                                    application.statusBarHidden = YES;
                                    return YES;
                                    }
                                    

                                    【讨论】:

                                    • 问题明确提到这种方法不起作用。请在回答之前仔细阅读问题。
                                    • 只要基于视图控制器的状态栏外观设置为 NO,这是最干净的方法。
                                    【解决方案26】:

                                    我不确定为什么您“无法登录 Apple 开发者论坛”,但是(不违反 NDA)您也可以通过 Xcode 隐藏您的状态栏。这是您的应用程序目标的一般设置。

                                    【讨论】:

                                    • 不,就像一个魅力。论坛已经上线一段时间了。
                                    猜你喜欢
                                    • 2013-11-12
                                    • 2015-09-17
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2013-09-25
                                    相关资源
                                    最近更新 更多