如何在iOS中更改状态栏文本颜色

1087

我的应用程序有一个黑色的背景,但在iOS 7中状态栏变成透明的了。因此我什么都看不到,只能看到角落里的绿色电池指示器。我该如何将状态栏文本颜色更改为像主屏幕上那样的白色呢?


查看我的答案以获取更好的解决方案 https://dev59.com/OmMm5IYBdhLWcg3wX98W#65367444 - Ucdemir
Xcode似乎在不断变化,因此我建议向下滚动以查找更近期的解决方案(例如,截至2021年的超级简单答案)。 - Eric33187
60个回答

1471
  1. 在.plist文件中设置UIViewControllerBasedStatusBarAppearanceYES

  2. viewDidLoad方法中执行[self setNeedsStatusBarAppearanceUpdate];

  3. 添加以下方法:

    - (UIStatusBarStyle)preferredStatusBarStyle
    { 
        return UIStatusBarStyleLightContent; 
    }
    

注意: 这种方法不适用于嵌套在 UINavigationController 中的控制器,请参考下面Tyson的评论 :)

Swift 3 - 这种方法适用于嵌套在UINavigationController中的控制器。将以下代码添加到您的控制器中。

// Preferred status bar style lightContent to use on dark background.
// Swift 3
override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Swift 5 和 SwiftUI

对于 SwiftUI,请创建一个名为 HostingController.swift 的新的 Swift 文件。

import Foundation
import UIKit
import SwiftUI

class HostingController: UIHostingController<ContentView> {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}

然后在 SceneDelegate.swift 中更改以下代码行:

window.rootViewController = UIHostingController(rootView: ContentView())

window.rootViewController = HostingController(rootView: ContentView())

83
我不需要第二步骤。 - Jason Moore
42
似乎在iOS 7 Beta 5和Xcode5-DP5上无法正常工作。preferredStatusBarStyle没有被调用。 - wilsontgh
20
在Xcode 5 GM种子版中,UIViewControllerBasedStatusBarAppearance被更改为基于视图控制器的状态栏外观。 - parilogic
44
Xcode GM Seed 的答案如下:1. 在 Info.plist 文件中将 View controller-based status bar appearance 设置为 NO。2. 在 appDelegate 中的 appDidFinishLaunching 方法中加入 [[UIView appearance] setTintColor:[UIColor whiteColor]] 代码。 - parilogic
111
UINavigationController 是一个特殊情况,上述方法不适用。我也曾经花了几个小时来解决这个问题。请查看这里的解决方案:https://dev59.com/KGMk5IYBdhLWcg3wtgQR#19513714。 - Tyson
显示剩余16条评论

867

或者,你可以选择退出基于视图控制器的状态栏外观:

  1. 在你的 Info.plist 中将 View controller-based status bar appearance 设置为 NO
  2. 调用 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

注意:这种方法已经在iOS9中被弃用。请改用UIViewController上的 preferredStatusBarStyle。 (参见Apple Developer Library)


18
这是一条更好、更容易的路线。 - Mick Byrne
235
无需编码,所有操作都可通过属性列表(plist)完成:(1)将“View controller-based status bar appearance”设置为“NO”,(2)将“Status bar style”设置为“Opaque black style”。(原始数值分别为UIViewControllerBasedStatusBarAppearance -> NO 和 UIStatusBarStyle -> UIStatusBarStyleBlackOpaque) - SwiftArchitect
4
请注意,为了使此功能正常工作,您 必须 将相关的 info.plist 值设置为 NO。 - Abhi Beckert
10
不错的发现。如果你愿意,我会接受你的答案,因为它是最简洁的。“Bar Style”的亮色选项可以是:UIStatusBarStyleLightContent。 - benka
11
这种方法在iOS 9中已被弃用。 - lostAtSeaJoshua
显示剩余12条评论

456
您可以在不编写任何代码的情况下完成此操作!
按照以下步骤使整个应用程序的状态栏文本颜色为白色。

在您的项目 plist文件中:

  • 状态栏样式: 透明黑色样式(alpha为0.5)
  • 基于视图控制器的状态栏外观:NO
  • 状态栏最初是隐藏的:NO

13
我不知道事情是否有所改变,但是 XCode 并不认可 UIStatusBarStyleLightContent 值,且在任何文档中都找不到它的记录……尽管它似乎可以工作。 - Nathan H
6
这个还在启动画面上进行了更改,而仅仅在导航器上设置则不会...太棒了! - viniciusnz
4
肯定是最简单的方法,可以完成这个任务,而且正如提到的那样,也适用于启动画面。 - 7wonders
5
plist info 中没有名为 UIStatusBarStyleLightContent 的东西,但是有一个名为 透明黑色 的选项可以起到相同的效果 :) 另外,您需要添加 View controller-based status bar appearance,因为它最初不在那里,这就是您需要使其正常工作的全部内容 :) - user1949873
49
<key>UIStatusBarStyle</key> <string>UIStatusBarStyleLightContent</string> <key>UIViewControllerBasedStatusBarAppearance</key> <false/>这段代码用于设置iOS应用程序状态栏的样式。其中,UIStatusBarStyle指定状态栏的颜色为白色,UIViewControllerBasedStatusBarAppearance设置为false表示不基于视图控制器而是全局设置整个应用程序的状态栏样式。 - Adam Waite
显示剩余5条评论

251

注意:得票最高的答案在iOS 7/8上不起作用

在Info.plist中将“View controller-based status bar appearance”设置为NO

在AppDelegate中添加

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
   ...
}    

这个解决方案适用于iOS 7/8。


12
在iOS 9中已弃用。 :-/ - sudo make install

124

对我来说,使用其他答案中提供的所有东西(以及其他来源/文档)都没有任何帮助。有所帮助的是在XIB中将导航栏样式设置为“黑色”。这样就可以在不使用任何代码的情况下将文本更改为白色。

Enter image description here


3
在这个设备上,以上的答案都对我没用,但是这个可以。我认为这说明了关于新系统的一切,你必须将导航栏设置为黑色才能使状态栏文本变成白色。 - MrTJ
2
在经历了许多困难之后,最终解决了问题。样式设置为默认值。更改了这个并剥离了所有其他状态栏的黑客,现在它可以正常工作了。 - Kudit
1
如果您不想在IB中设置所有导航栏,则还可以设置其外观代理。[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack]; - Steve Moser
3
在iOS7的Storyboard中对我不起作用。看起来这可能是其他问题的副作用? - Chris
@SteveMoser 的回答在编程方面对我很有帮助。谢谢! - Abdo
显示剩余4条评论

106

对我来说,这些都不起作用,因此这是一个有效的解决方案...

Info.plist 文件中添加一行:

UIViewControllerBasedStatusBarAppearance,并将值设置为 NO

然后在 AppDelegate 的 didFinishLaunchingWithOptions 中添加以下行:

[application setStatusBarHidden:NO];
[application setStatusBarStyle:UIStatusBarStyleLightContent];

这个解决方案对我有效,而上面的那些则没有。 - John Contarino
很棒,但这个UIViewControllerBasedStatusBarAppearance转换成同样的:基于视图控制器的状态栏外观自动 :) - Abhishek Thapliyal

84

这不需要编写任何代码

您需要在info.plist中添加“View controller-based status bar appearance”键,如下所示:enter image description here

& 将其值类型设置为布尔型,值设置为NO。 然后单击项目设置,然后单击常规选项卡,在部署信息下将首选状态栏样式设置为.Light,如下所示:

enter image description here

就是这些。


1
我喜欢你的方法!对于我的情况,我一直在尝试弄清楚如何使状态栏样式仅在全屏时(无导航栏)为浅色。后来,我意识到所有其他屏幕都应当具有相同的浅色风格。因此,一个好的解决方案是设置整个应用的样式。谢谢!(:) - Igor de Lorenzi
如果您的应用程序在运行时不需要更改此内容,则这是最佳方法。 - Michael
这种方法确实可行,但在iPad上会引入一个奇怪的问题。如果您的应用程序支持深度链接,并且通过深度链接启动应用程序,则状态栏上出现的返回链接会消失。 - Chitranshu Asthana
最好和最简单的一个。 - Amit Kumar
对我来说最好的解决方案:D - Gold Chicken

54

只需要两个步骤:

步骤1:

项目目标Info选项卡下,添加行:

UIViewControllerBasedStatusBarAppearance,将值设置为NO

步骤2:

在项目的AppDelegate.m文件中:

- (BOOL)application:(UIApplication *)application 
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    …
    [application setStatusBarStyle:UIStatusBarStyleLightContent];
    …
}

4
我喜欢这个答案,因为这是我第一次使用“应用程序”参数。 - MUH Mobile Inc.
点表示法,那就完美了 ;) - Rivera

50

这在Golden Master的iOS 7和Xcode 5 GM种子版本以及于2013年9月18日发布的iOS 7 SDK中运行良好(至少在隐藏导航控制器时):

  1. Info.plist中将UIViewControllerBasedStatusBarAppearance设置为NO

  2. ViewDidLoad方法或任何需要更改状态栏样式的地方使用以下代码:[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];


1
UIViewControllerBasedStatusBarAppearance的默认值似乎是YES。“应用程序默认使用新的基于视图控制器的状态栏管理系统。要退出此操作,请将UIViewControllerBasedStatusBarAppearance键的值添加为NO到您的Info.plist中。” [http://bgr.com/2013/09/10/ios-7-gm-change-log-release-notes/] - Zsolt
1
耶!!将UIViewControllerBasedStatusBarAppearance设置为NO后,状态栏在视图中隐藏了。 - CashLee李秉骏
你可以将它添加到appDelegate的didFinishLoading方法中,或者在第一个视图的viewDidLoad方法中添加,如果你不想改变它。 - Deniss Fedotovs
@KarenAnne 试着将 UIStatusBarStyleLightContent 改为 UIStatusBarStyleDefaultUIStatusBarStyleBlackOpaqueUIStatusBarStyleBlackTranslucent - Deniss Fedotovs
1
太棒了,这个完成了任务。简单而优秀的编程。 - Felipe
显示剩余2条评论

35

不,这只是使导航栏颜色与状态栏文本颜色相同。这隐藏了问题,而不是解决了它! - wpearse
2
在iOS7中,如果视图包含UINavigationController,则状态栏将模仿UINavigationBar,因此在许多情况下,这是正确的答案。 - jonstaff

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