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

65

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

我尝试了preferredStatusBarStyle和其他几种方法,但没有成功。

10个回答

187
  1. 在您的info.list文件中将“View controller-based status bar appearance”设置为NO
  2. 在你的代码中插入:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        [[UIApplication sharedApplication] setStatusBarHidden:NO];
        return YES;
    }
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

在 AppDelegate.m 文件的 -application:didFinishLaunchingWithOptions: 方法中,可以设置状态栏的样式。默认情况下,状态栏的样式为 UIStatusBarStyleDefault,将显示黑色内容。iOS 7.0 中已经弃用了 UIStatusBarStyleBlackTranslucentUIStatusBarStyleBlackOpaque


iOS 9 的更新:

@ZakariaDarwish所述,方法-setStatusBarStyle在 iOS 9 中已经被弃用(注意:原问题是很久以前针对 iOS 7 提出的,现在不再支持,下面的新解决方案适用于我在 iOS 9 下的情况)。

因此,(至少目前)唯一的方法是在视图控制器中实现 -preferredStatusBarStyle 方法(记得将“基于视图控制器的状态栏外观”设置为 YES)。

可以在 -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);
}

现在针对此更新的解决方案。


5
提示:如果您在 -application:didFinishLaunchingWithOptions: 方法中进行设置,可以使用“应用程序(application)”代替 [UIApplication sharedApplication]。请注意,这不会改变原始代码的含义。 - jomafer
也适用于iOS 8.2。 - uerceg
2
请注意:由于在应用程序加载之前不会调用application:didFinishLaunchingWithOptions方法,因此这将不会更改启动屏幕上状态栏的颜色。 - SimplGy
如果还要影响启动屏幕,请改用 .plist 方法:https://dev59.com/gWMk5IYBdhLWcg3w3xlY#18898750 - SimplGy

70

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

  1. 将“View controller-based status bar appearance”设置为NO
  2. 将“Status bar style”设置为UIStatusBarStyleLightContent

或者您可以在目标的 General 标签中指定状态栏样式为“Black Opaque”或“Black Translucent”。(在 Xcode 5.0.1 中)但它们已经过时了。


2
非常出色,十分感激。随着iOS 9.0中setStatusBarStyle的弃用,这是绝对的救星。 - Terrance Shaw

26
我在主控制器中使用了这个:
- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

14
将这两个密钥放置在 info.plist 文件中。

在此输入图片描述


9

这里有一个简单的方法来设置状态栏颜色为白色

1)首先将这一行View controller-based status bar appearance复制到你的.plist文件中,并将布尔值设为NO

2)在你的AppDelegate.m文件中,在didFinishLaunchingWithOptions下粘贴以下内容:

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

或者在 .plist 文件中添加

在这里输入图片描述


6

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

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;

5
    #ifdef __IPHONE_7_0
    # define STATUS_STYLE UIStatusBarStyleLightContent
    #else
    # define STATUS_STYLE UIStatusBarStyleBlackTranslucent
    #endif

    [[UIApplication sharedApplication] setStatusBarStyle:STATUS_STYLE animated:YES];

那只是一个编译时的决定,而不是运行时的决定。 - Todd Lehman

5
如果你的应用程序每个视图控制器的状态栏内容颜色不同,最好的方法是实现:
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文件中将“View controller-based status bar appearance”设置为“NO”


4

注意,如果你正在使用UINavigationController,你可以将以下代码放入视图控制器的viewDidLoad方法中:

self.navigationController.navigationBar.barStyle = UIStatusBarStyleLightContent;

2
这是错误的!barStyleUIBarStyle 类型,它没有 UIStatusBarStyleLightContent - Zorayr
是的,它似乎无论如何都能工作。我知道它在类描述中没有该属性,但它似乎会将UIBarStyle转换为UIStatusBarStyle,原因不明。你可以在一行代码中自己测试一下... - Shawn
1
@Shawn 这些枚举都是 NSInteger 类型,这就是为什么它不会报错的原因。如果你在构建设置中启用所有警告,由于类型不匹配,它将变成一个警告。 - art-divin
@art-divin 你知道为什么即使有警告,它仍然按照我的意图使用吗? - Shawn
@shawn 它能正常工作是因为状态栏从 UINavigationBar 继承了许多设置,并相应地进行了调整。因此,状态栏中的颜色、透明度、文本和内容将根据 UIBarStyle 进行调整。我在这里找到了一篇非常好的文章 (https://possiblemobile.com/2013/09/developers-guide-to-the-ios-7-status-bar/)。 - jriskin

2

如果要在 Swift 3 中以编程方式实现它,请在视图控制器中尝试以下内容。

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
  }

我还将plist键“View controller-based status bar appearance”设置为YES。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接