如何在 iOS 7 上将状态栏内容颜色设置为白色

Posted

技术标签:

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

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

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

【问题讨论】:

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

    插入

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    

    致 AppDelegate.m 的 -application:didFinishLaunchingWithOptions:


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


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 方法:***.com/a/18898750/111243【参考方案2】:

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

    将“基于查看控制器的状态栏外观”设置为 NO 将“状态栏样式”设置为 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;

【讨论】:

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

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

override var preferredStatusBarStyle: UIStatusBarStyle 
    return .lightContent
  

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

【讨论】:

以上是关于如何在 iOS 7 上将状态栏内容颜色设置为白色的主要内容,如果未能解决你的问题,请参考以下文章

如何在iOS 7上更改状态栏背景颜色和文本颜色? Warif Akhand Rishi

iOS 7:如何在一个视图控制器中将状态栏文本颜色更改为白色,在第二个视图控制器中更改为黑色?

自定义 iOS 7 状态栏文本颜色

如何在 iOS 7 上更改状态栏背景颜色和文本颜色?

ios7 statusBar的字体颜色怎么设置为白色的呢

iOS开发技巧:设置状态栏字体颜色