【问题标题】:How to set status bar's content color to white on iOS 7如何在 iOS 7 上将状态栏内容颜色设置为白色
【发布时间】:2013-09-28 00:46:31
【问题描述】:

我的应用程序的背景颜色是黑色。由于 iOS 7 上整个视图都在状态栏下方,因此很难区分状态栏上的内容。那么如何将状态栏的内容颜色改为白色呢?

我尝试了preferredStatusBarStyle 和其他几种方法,但都失败了。

【问题讨论】:

    标签: ios cocoa-touch uikit ios7


    【解决方案1】:
    1. 在您的 info.list 文件中将“查看基于控制器的状态栏外观”设置为 NO;
    2. 插入

      [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
      

      致 AppDelegate.m 的 -application:didFinishLaunchingWithOptions:。


    注意:UIStatusBarStyleDefault 是状态栏样式的默认值,它会显示黑色内容。在 iOS 7.0 中,UIStatusBarStyleBlackTranslucent 和 UIStatusBarStyleBlackOpaque 都已弃用。


    iOS 9 更新:

    正如@ZakariaDarwish 提到的,-setStatusBarStyle 方法在 iOS 9 中已弃用。(注意:最初的问题是很久以前针对 iOS 7 提出的,我现在不支持它,下面的新解决方案适用于我在 iOS 9 下,因此在这里更新。)

    所以,剩下的唯一方法(至少现在)是在您的视图控制器中实现-preferredStatusBarStyle(记得将“基于视图控制器的状态栏外观”设置回 是)。

    一旦-preferredStatusBarStyle 或-prefersStatusBarHidden 中的值发生更改,您就可以调用UIViewController 的实例方法-setNeedsStatusBarAppearanceUpdate。

    还有两种方法 -childViewControllerForStatusBarStyle 和 -childViewControllerForStatusBarHidden 可以根据需要从子视图控制器返回首选样式。

    例如,如果您使用以下方法

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES];
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
    

    要切换之前的状态栏样式,可以使用下面的代码示例

    - (void)shouldChangeStatusBarStyleToLightContent:(BOOL)toLightContent
                                            animated:(BOOL)animated
    {
      _shouldChangeStatusBarStyleToLightContent = toLightContent;
      if (animated) {
        [UIView animateWithDuration:.3f animations:^{ [self setNeedsStatusBarAppearanceUpdate]; }];
      } else {
        [self setNeedsStatusBarAppearanceUpdate];
      }
    }
    
    - (UIStatusBarStyle)preferredStatusBarStyle
    {
      return (_shouldChangeStatusBarStyleToLightContent ? UIStatusBarStyleLightContent : UIStatusBarStyleDefault);
    }
    

    现在为这个更新的解决方案。

    【讨论】:

    • 仅提示:如果您在 -application:didFinishLaunchingWithOptions: 中设置此项,则可以使用 application 而不是 [UIApplication sharedApplication]:
    • 也适用于 iOS 8.2。
    • 注意:因为application:didFinishLaunchingWithOptions 在应用程序加载之前不会被调用,这将不会改变启动屏幕上状态栏的颜色。
    • 要同时影响启动屏幕,请改用 .plist 方法:stackoverflow.com/a/18898750/111243
    【解决方案2】:

    在您的 *-Info.plist 文件中:

    1. 将“基于查看控制器的状态栏外观”设置为 NO
    2. 将“状态栏样式”设置为 UIStatusBarStyleLightContent

    或者,您可以在目标的常规选项卡中将状态栏样式指定为“黑色不透明”或“黑色半透明”。(在 Xcode 5.0.1 中)但它们是过时的值。

    【讨论】:

    • 非常出色,非常感谢。随着 iOS 9.0 中 setStatusBarStyle 的弃用,这绝对是天赐之物。
    【解决方案3】:

    我在主控制器中使用它:

    - (UIStatusBarStyle)preferredStatusBarStyle
    {
        return UIStatusBarStyleLightContent;
    }
    

    【讨论】:

      【解决方案4】:

      将这两个键放在 info.plist

      【讨论】:

        【解决方案5】:

        这里是设置状态栏颜色白色的简短解决方案

        1) 首先将此行View controller-based status bar appearance 复制到您的.plist 文件中并设置布尔值NO;

        2) 在 didFinishLaunchingWithOptions 下的 AppDelegate.m 文件中粘贴此

        [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
        [[UIApplication sharedApplication] setStatusBarHidden:NO];
        

        或添加 .plist

        【讨论】:

          【解决方案6】:

          iOS 9(已弃用的警告解决方法)

          [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
          

          【讨论】:

            【解决方案7】:
                #ifdef __IPHONE_7_0
                # define STATUS_STYLE UIStatusBarStyleLightContent
                #else
                # define STATUS_STYLE UIStatusBarStyleBlackTranslucent
                #endif
            
                [[UIApplication sharedApplication] setStatusBarStyle:STATUS_STYLE animated:YES];
            

            【讨论】:

            • 不过,这只是编译时的决定——而不是运行时的决定。
            【解决方案8】:

            如果您的应用程序的每个视图控制器的状态栏内容颜色不同,则首选方法将是实现

            override var preferredStatusBarStyle: UIStatusBarStyle {
                return .lightContent
            }
            

            如果您需要在整个应用程序中全局更改栏的内容颜色,请在 AppDelegate 的 didFinishLaunchingWithOptions 方法中添加以下代码行

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

            如果您的应用程序正在使用默认的基于 UIViewController 的状态栏系统,则等待设置 statusBarStyle 没有任何作用。为此

            在 info.list 文件中将“基于控制器的状态栏外观”设置为 NO

            【讨论】:

              【解决方案9】:

              只是一个注释,因为它在那里。如果您使用的是 UINavigationController,则可以将其放入视图控制器 viewDidLoad 方法中:

              self.navigationController.navigationBar.barStyle = UIStatusBarStyleLightContent;
              

              【讨论】:

              • 这是错误的! barStyle 是 UIBarStyle 类型,它没有 UIStatusBarStyleLightContent。
              • 是的,无论如何它似乎都有效。我知道它在类描述中没有该属性,但无论出于何种原因,它似乎都将 UIBarStyle 转换为 UIStatusBarStyle 。一行代码就可以自己测试了……
              • @Shawn 这些枚举都是 NSInteger 类型,这就是它不会报错的原因。如果您在构建设置中启用所有警告,则由于类型不匹配,这将成为警告。
              • @art-divin 你知道为什么即使有警告,它也会按照我的预期用途进行吗?
              • @shawn 之所以有效,是因为状态栏从 UINavigationBar 继承了一堆设置并进行相应调整。所以状态栏的颜色、透明度、文字和内容都会根据UIBarStyle进行调整。我找到了一个非常好的write up here。
              【解决方案10】:

              要在 Swift 3 中以编程方式执行此操作,请在视图控制器中的任何位置尝试此操作。

              override var preferredStatusBarStyle: UIStatusBarStyle {
                  return .lightContent
                }
              

              我还将 plist 键“查看基于控制器的状态栏外观”设置为 YES。

              【讨论】:

                猜你喜欢
                • 2014-08-31
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-10-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多