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


990

我的应用程序具有深色背景,但是在iOS 7中状态栏变为透明的。所以我看不到任何东西,只有角落的绿色电池指示灯。如何将状态栏文本的颜色更改为白色,就像在主屏幕上一样?


9
此链接上有关于此问题的有趣信息:doubleencore.com/2013/09/…–
Adriano Lucas

Answers:


1379
  1. UIViewControllerBasedStatusBarAppearanceYES在文件的.plist。

  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,创建一个新的swift文件,名为 HostingController.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())

78
我并不需要第2步
贾森·摩尔

37
似乎无法在带有Xcode5-DP5的iOS 7 Beta 5上运行。preferredStatusBarStyle似乎没有被调用。
wilsontgh

18
UIViewControllerBasedStatusBarAppearance更改为Xcode 5 GM种子中基于视图控制器的状态栏外观
parilogic 2013年

42
得到了Xcode GM Seed的答案:1.在Info.plist中,将基于View控制器的状态栏外观显示为NO。2.在appDelegate中,在appDidFinishLaunching方法中,放置[[UIView外观] setTintColor:[UIColor whiteColor]];
parilogic 2013年

101
UINavigationController是一个特例,上面的方法无效。仅仅花了几个小时就为此挠头。解决方案请参见此处:stackoverflow.com/a/19513714/505457
泰森(Tyson),

848

或者,您可以选择不使用基于视图控制器的状态栏外观:

  1. View controller-based status bar appearanceNOInfo.plist
  2. 呼叫 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

注意:此方法已在iOS9中弃用。请改用preferredStatusBarStyleUIViewController。(请参阅Apple Developer Library


16
这是一条更好,更轻松的路线。
米克·伯恩

227
无需编码。可以从plist中完成所有操作:(1)将“基于View Controller的状态栏外观”设置为NO,以及(2)将“ Status bar style”设置为“ Opaque black style”。(原始值为UIViewControllerBasedStatusBarAppearance-> NO和UIStatusBarStyle-> UIStatusBarStyleBlackOpaque)
SwiftArchitect 2013年

3
请注意,您必须将相关的info.plist值设置为NO才能起作用。
Abhi Beckert

9
@gothicdev:不错的收获。会接受您的答案,因为它是最干净的。酒吧风格的灯光选项可以是:UIStatusBarStyleLightContent
13年

9
此方法已被弃用在IOS 9
lostAtSeaJoshua

439

您无需编写任何代码行就可以做到这一点!
执行以下操作,使整个应用程序中的状态栏文本变为白色

在您的项目plist文件上:

  • 状态栏样式: Transparent black style (alpha of 0.5)
  • 查看基于控制器的状态栏外观: NO
  • 状态栏最初是隐藏的: NO

12
我不知道事情是否发生了变化,但是XCode不能识别UIStatusBarStyleLightContent值,并且在任何文档中都找不到...尽管它似乎可以工作。
内森·H

5
此选项还在初始屏幕上进行了更改,而仅在导航器上进行设置不会……荣誉!
viniciusnz 2013年

3
绝对是完成此操作的最简单方法,并且如上所述,它也可以在初始屏幕上使用。
2013年

4
有没有什么所谓UIStatusBarStyleLightContentplist info但是,有Transparent Black哪个会做同样的伎俩:)加上,你需要添加View controller-based status bar appearance因为它不存在最初,它是所有你需要得到它的工作:)什么
user1949873

45
对于像我这样的懒人,请复制并过去: <key>UIStatusBarStyle</key> <string>UIStatusBarStyleLightContent</string> <key>UIViewControllerBasedStatusBarAppearance</key> <false/>
Adam Waite 2014年

241

注意:多数赞成的答案不适用于iOS 7/8

在Info.plist中,将“基于视图控制器的状态栏外观”设置为“否”

在AppDelegate中添加

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

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

此解决方案适用于iOS 7/8


10
在iOS 9中不推荐使用。:-/
sudo make install

112

对我而言,使用其他答案(以及来自其他来源/文档)中的所有内容并没有发生任何事情。有所帮助的是在XIB中将导航栏样式设置为“黑色”。这将文本更改为白色,完全没有任何代码。

在此处输入图片说明


3
在设备中,以上答案均不适用于我,但此答案适用于我。我认为它告诉了有关新系统的所有信息,您必须将navigation_bar设置为BLACK才能使status_bar文本为WHITE。
MrTJ 2013年

2
经过很多事情的努力,这才是最终的结果。样式设置为默认。更改了此内容,并删除了所有其他状态栏hack,并且可以使用。
古杰明

1
如果您不想在IB中设置所有导航栏,则还可以设置其外观代理。[[UINavigationBar外观] setBarStyle:UIBarStyleBlack];
Steve Moser 2014年

3
在iOS7故事板中对我不起作用。看起来这可能是其他副作用吗?
克里斯

我想确认的是,以上所有答案对我都不起作用。在图像之后,状态栏文本显示为白色。但我再说一遍,上述带有Xcode 6.2和iOS 8.2的答案不起作用。
马库斯

98

这些都不对我有用,所以这是一个可行的解决方案...

Info.plist,添加一行:

UIViewControllerBasedStatusBarAppearance,然后设置值 NO

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

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

这个解决方案对我有用,而上述解决方案却没有。
John Contarino

很棒,但是此UIViewControllerBasedStatusBarAppearance可以转换为相同的样式:自动查看基于控制器的状态栏外观:)
Abhishek Thapliyal,2016年

63

您不需要为此做任何代码

您需要在info.plist中添加“基于视图控制器的状态栏外观”键,如下所示: 在此处输入图片说明

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

在此处输入图片说明

而已。


1
我喜欢你的方法!就我而言,我试图弄清楚如何使状态栏样式仅在全屏状态下才显示(不带导航栏)。然后,我意识到所有其他屏幕都应该适合相同的灯光样式。因此,一个好的解决方案是为整个事情做好准备。谢谢!(:
Igor de Lorenzi

如果您在应用程序运行时无需更改此设置。这是最好的方法。
迈克尔,

这种方法肯定有效,但在iPad上引入了一个奇怪的问题。如果您的应用程序支持深层链接,并且当您通过深层链接启动应用程序时,状态栏上出现的反向链接将消失。
Chitranshu Asthana

最好和最简单的一种。
阿米特·库玛

对我来说最好的解决方法:D
金鸡

48

只需执行以下两个步骤:

步骤1:

在“ project target添加行”的“信息”标签下:

UIViewControllerBasedStatusBarAppearance, 设定值 NO

第2步:

在项目中AppDelegate.m

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

4
我喜欢这个答案,因为这是我第一次使用“应用程序”参数))
MUH Mobile Inc. 2014年

点符号,这将是完美的;)
Rivera 2014年

43

此功能适用于2013年9月18日发布的Golden Master iOS 7和Xcode 5 GM种子以及iOS7 SDK(至少隐藏了导航控制器):

  1. 设置the UIViewControllerBasedStatusBarAppearanceNOInfo.plist

  2. ViewDidLoad方法或任何位置中,要在何处更改状态栏样式: [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];


1
UIViewControllerBasedStatusBarAppearance的默认值似乎为YES。“应用程序默认使用新的基于视图控制器的状态栏管理系统。要选择退出,请为Info.plist添加UIViewControllerBasedStatusBarAppearance键的NO值。” [ bgr.com/2013/09/10/ios-7-gm-change-log-release-notes/]
Zsolt

1
是的!将UIViewControllerBasedStatusBarAppearance设置为NO后,状态栏将隐藏在视图中。
CashLee李秉骏2013年

是否应将其应用于所有viewdidload?
Arnlee Vizcayno 2013年

您可以仅在appDelegates didFinishLoading方法中添加它。或者如果您不希望更改,则在第一个视图中使用viewDidLoad方法。
Deniss Fedotovs 2013年

1
太棒了,这个工作完成了。简单而出色的编码。
费利佩2014年

32

如果您的UIViewController在UINavigationController内部,则必须设置BarStyle:

-[UINavigationBar setBarStyle:UIBarStyleBlack]

原始答案在这里

https://devforums.apple.com/message/844264#844264


不,这只是使导航栏颜色与状态栏文本颜色相同。这隐藏了问题,没有解决!
wpearse 2013年

2
在iOS7中,如果视图包含UINavigationController,则状态栏将模仿UINavigationBar,因此在许多情况下,这是正确的答案。
jonstaff 2014年

29

如果您具有通过Interface Builder创建的嵌入式导航控制器,请确保在管理导航控制器的类中设置以下内容:

-(UIStatusBarStyle)preferredStatusBarStyle{ 
    return UIStatusBarStyleLightContent; 
} 

那应该是您所需要的。


这是在无故事板和无xib的应用程序中对我有用的唯一解决方案。对于非IB用户也应该有所帮助。
约翰尼·斯帕克斯

2
当我需要在每个视图控制器中分别设置样式时,这对我来说是完美的
2013年

如果要保留“基于View Controller的状态栏外观”设置为“是”,这就是方法。谢谢!
cloudurfin 2014年

28

我正在Swift项目上针对iOS 7应用程序使用Xcode 6 beta 5 。

这是我所做的,并且有效:

info.plist:

在此处输入图片说明


2
谢谢,看来只有您的解决方案可以使用最新版本的IOS7
Dekel Maman

此解决方案在加载应用程序时在启动屏幕中显示状态栏。
Juan Boero

解决了我在xCode 7.1中的问题。最新版本。苹果公司忘记了一些关键要素来使某些东西起作用。再次。
Michael

22

在AppDelegate.m中,添加以下内容。

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

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

} 

并在Plist文件中,将“基于View Controller的状态栏外观”设置为NO。



20

好吧,对我来说,这真的像小菜一碟。

转到您应用的info.plist

  1. 设置View controller-based status bar appearanceNO
  2. 设置Status bar styleUIStatusBarStyleLightContent

然后转到应用程序的委托,并粘贴以下代码,在其中设置Windows的RootViewController。

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
    UIView *view=[[UIView alloc] initWithFrame:CGRectMake(0, 0,320, 20)];
    view.backgroundColor=[UIColor colorWithRed:0/255.0 green:0/255.0 blue:0/255.0 alpha:1.0];
    [self.window.rootViewController.view addSubview:view];
}

答对了。它为我工作。


1
我认为这是正确的答案(plist的一部分)...为什么要在didfinishlaunchingwithoptions上添加静态代码...如果您需要整个应用程序使用相同的颜色,这是正确的方法
user2387149 2014年

20
  1. 转到Project-> Target

  2. 然后设定Status Bar StyleLight。在启动屏幕上,状态栏变为白色。 项目设定

  3. 然后设置View controller-based status bar appearance等于NOin Info.plist


2
你设置的实际第二部分View controller-based status bar appearance equalNO是件我失踪。谢谢
请问

18

更改信息PLIST 在Swift 3中,仅需两个步骤就非常容易。转到您的info.plist并将密钥更改View controller-based status bar appearance为“ NO”。然后在Appdelegate中,只需在didfinishlaunchingwithoptions方法中添加此行

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        UIApplication.shared.statusBarStyle = .lightContent
        return true
    }

此功能已在iOS9中弃用,现在您应该在rootviewcontroller中覆盖此属性

在iOS 9中已不建议这样做,请在rootviewcontroller上执行此操作

override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
 }

1
真是太棒了:)谢谢。
Naresh Reddy M

在iOS 9中已不建议这样做,请在rootviewcontroller覆盖上执行此操作var preferredStatusBarStyle:UIStatusBarStyle {return .lightContent}
James Rochabrun

17

iOS 7允许各个视图控制器确定状态栏的外观,如Apple开发人员文档所述:

iOS 7使视图控制器能够在应用程序运行时调整状态栏的样式。动态更改状态栏样式的一种好方法是preferredStatusBarStyle在动画块内实现并更新状态栏外观并调用setNeedsStatusBarAppearanceUpdate

全局设置状态栏外观是一个分为两个步骤的过程。

首先,您需要告诉iOS,您不想在逐个视图的基础上设置状态栏外观。

然后,您需要负责并实际设置新的全局状态栏样式。

要禁用逐视图状态栏控件,您需要View controller-based status bar appearanceInfo.plist

打开项目导航器,然后为您的iOS应用选择项目,然后选择“信息”选项卡。

将鼠标悬停在一行上,然后点击显示的加号,将新属性添加到您的 .plist

View controller-based status bar appearance在“密钥”字段中输入,然后确保“类型”字段设置为Boolean。最后输入NO在“值”字段中。

要为状态栏设置全局样式,请在“信息”选项卡下添加另一个属性,键为Status bar style,类型为String,值为Opaque black style

这是一篇博客文章,其中包含更多细节和一些示例代码:

http://codebleep.com/setting-the-status-bar-text-color-in-ios-7/


谢谢。我的问题是我没有看到“基于视图控制器的状态栏外观”的类型设置为“字符串”。手动编辑.plist文件并输入布尔值可以清除所有内容。
克里斯·普林斯

12

无需执行任何其他操作,只需在viewController中编写此代码,然后将状态栏颜色设置为白色

- (UIStatusBarStyle)preferredStatusBarStyle{return UIStatusBarStyleLightContent;}

实施后,将其放在ViewController.m下。它最简单,效果很好!谢谢Mohit!
Phil Mulkins 2014年

12

Xcode GM Seed的答案已更新:

  1. Info.plistView controller-based status bar appearanceNO

  2. 在项目中,设置:

    在此处输入图片说明

  3. 在ViewDidLoad中:

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];


那改变了标签栏,而不是我的状态栏。
基思(Keith)

11

我认为所有答案并没有真正指出问题所在,因为它们都在特定情况下起作用。但是,如果您需要涵盖所有情况,请遵循以下几点:

根据需要在何处使用状态栏灯样式,应始终牢记以下三点:

1)如果需要在启动屏幕或其他地方无法控制它的状态栏(不是在视图控制器中,而是在某些系统控制的元素/瞬间,如启动屏幕), 请转到项目设置 项目设定

2)如果导航控制器内有一个控制器,则 可以在界面构建器中进行如下更改:

a)选择导航控制器的导航栏 选择导航控制器的导航栏

b)然后将导航栏的样式设置为“黑色”,因为这意味着您在状态栏下将有一个“黑色”->深色背景,因此它将状态栏设置为白色

在此处输入图片说明

或按以下代码执行

navigationController?.navigationBar.barStyle = UIBarStyle.Black

3)如果仅控制器需要具有自己的状态栏样式,并且不作为UINavigationController嵌入在某些容器结构中

在代码中为控制器设置状态栏样式:

在代码中设置状态栏样式


请说明您的情况,我会尽力提供帮助
福克斯(Fawkes)2015年

1
我必须将StatusBarIsIntiallyHidden = NO添加到plist以及将ViewControllerBasedApplicationStatusBarAppearnce = NO添加到plist。然后,使用第一部分进行工作
Michael

您是否有一个与第一个加载视图控制器具有相同“图像”的启动屏幕?而且,在目标的“信息”部分中,您可以尝试将“隐藏状态栏”设置为false,并避免处理.plist。“ StatusBarIsIntiallyHidden”标志
福克斯2015年

我不。它使用生成的默认xib。
迈克尔

在xCode 7.1中创建一个新项目时,我实际上发现了这个问题,这就是为什么我认为它是如此奇怪
Michael Michael

10

只需致电

[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];

在里面

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

AppDelegate在iOS7中,我的工作方法非常适合我。


哇,这里有很多废话,但是这个答案对我有用。我正在使用Xcode 6和iOS 8 SDK
Ethan Parker

1
View controller-based status bar appearance = NO
太好了

9

这在《iOS 7 UI过渡指南》中有所记录,您需要Apple开发人员ID才能直接访问。相关摘录:

由于状态栏是透明的,因此它后面的视图将显示出来。[...]使用一个UIStatusBarStyle常量来指定状态栏内容是暗还是亮:

UIStatusBarStyleDefault显示暗色内容。[...]

UIStatusBarStyleLightContent显示灯光内容。当状态栏后面有深色内容时使用。

也可能感兴趣:

在iOS 7中,您可以从单个vew控制器控制状态栏的样式,并在应用运行时对其进行更改。要选择这种行为,请将UIViewControllerBasedStatusBarAppearance密钥添加到应用程序的Info.plist文件中并为其指定值YES

我绝对建议您浏览一下该文档,同样,您可以使用Apple开发人员ID进行访问。


3
我已经尝试过[application setStatusBarStyle:UIStatusBarStyleLightContent];但实际上没有任何变化,文本颜色仍然是黑色
Oleksandr Veremchuk

我希望能获得更多帮助,但是就像我说的那样,我对iOS开发过程并不熟悉,无法知道建议。抱歉!
亚伦·米勒

1)在plist中将UIViewControllerBasedStatusBarAppearance设置为YES 2)在viewDidLoad中执行[self setNeedsStatusBarAppearanceUpdate];3)添加以下方法:-(UIStatusBarStyle)preferredStatusBarStyle {return UIStatusBarStyleLightContent; }
Peter B. Kramer 2013年

9

这是有关状态栏更改的Apple准则/说明。状态栏中仅允许使用深色和浅色(白色和黑色)。

这是-如何更改状态栏样式:

如果要设置状态栏样式,则在“ .plist”文件中将应用程序级别设置UIViewControllerBasedStatusBarAppearanceNO

如果要设置状态栏样式,请在视图控制器级别执行以下步骤:

  1. 设置UIViewControllerBasedStatusBarAppearanceYES.plist文件,如果需要设置状态栏样式仅UIViewController的水平。
  2. 在viewDidLoad中添加功能- setNeedsStatusBarAppearanceUpdate

  3. 在视图控制器中重写preferredStatusBarStyle。

--

override func viewDidLoad() {
    super.viewDidLoad()
    self.setNeedsStatusBarAppearanceUpdate()
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

根据状态栏样式设置级别设置.plist的值。 在此处输入图片说明


这是一些技巧,可以在应用程序启动或视图控制器的viewDidLoad期间更改/设置状态栏的背景颜色。

extension UIApplication {

    var statusBarView: UIView? {
        return value(forKey: "statusBar") as? UIView
    }

}

// Set upon application launch, if you've application based status bar
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

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


or 
// Set it from your view controller if you've view controller based statusbar
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        UIApplication.shared.statusBarView?.backgroundColor = UIColor.red
    }

}



结果如下:

在此处输入图片说明


8

我做了一些不同的事情,对我有用。

无需更改代码,就可以像下面这样配置.plist文件:

  • 查看基于控制器的状态栏外观>否
  • 状态栏样式> UIStatusBarStyleLightContent(简单字符串)

希望对您有所帮助。

编辑

对于每个视图控制器,我将情节提要中的“状态栏”的“模拟度量”属性从“推断”更改为“轻内容”


8

如果您希望使用Swift获得相同的结果,则可以在AppDelegate.swift文件中使用以下代码:

UINavigationBar.appearance().barStyle = .BlackTranslucent

状态栏的文本将为白色:-)!


8

如果仍要View controller-based status bar appearance在info.plist中使用设置为YES的情况,这意味着您可以更改每个视图控制器的状态栏,请对ViewDidLoad的状态栏中的白色文本使用以下内容:

[[[self navigationController] navigationBar] setBarStyle:UIBarStyleBlackTranslucent];

导航栏!=状态栏。
Michael Peterson 2015年

...您尝试过吗?(是的,关于状态栏)
eirik

7

在Plist中,添加以下内容:

  • 状态栏样式: UIStatusBarStyleLightContent
  • 查看基于控制器的状态栏外观: NO

7

在info.plist中,设置字段值NO 基于视图控制器的状态栏外观,并在目标>常规设置中设置状态栏样式灯。


2
冠军得主鸡肉晚餐
tommybananas 2015年

7

让我给您一个完整的答案。更改状态栏文本颜色非常容易,但是在iOS 7中,特别是对于新手来说,这有点令人困惑。

如果您试图通过选择视图控制器并转到右侧的“模拟度量”,将情节提要中的颜色从黑色更改为白色,它将无法正常工作,我也不知道为什么。它应该通过这样的更改来工作,但是无论如何都可以。

其次,您不会在plist中找到UIViewControllerBasedStatusBarAppearance属性,但默认情况下不存在。您必须通过单击+按钮将其自己添加,然后将其设置为NO。

iOS 7状态栏文字颜色

最后,您必须转到AppDelegate.m文件,并在didFinishLaunchingWithOptions方法中添加以下内容,并添加以下行:

     [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

这会将所有视图控制器的颜色更改为白色。希望这可以帮助!


此方法已在iOS 9
忠裴
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.