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

How to change Status Bar text color in iOS

提问人:Oleksandr Veremchuk 提问时间:7/16/2013 最后编辑:Navneet KaurOleksandr Veremchuk 更新时间:6/8/2023 访问量:669176

问:

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

iOS Swift iOS7 状态栏 UISstatusBar

评论

0赞 Ucdemir 12/19/2020
看看我的鼻孔,寻找更好的解决方案 stackoverflow.com/questions/17678881/......
0赞 Eric33187 4/3/2021
Xcode 似乎在不断改变这一点,所以我建议向下滚动以找到最新的解决方案(例如,截至 2021 年的超级简单答案)。

答:

13赞 Aaron Miller 7/16/2013 #1

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

由于状态栏是透明的,因此会显示其后面的视图。[...]使用常量指定状态栏内容应为深色还是浅色:UIStatusBarStyle

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

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

可能还感兴趣:

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

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

评论

3赞 Oleksandr Veremchuk 7/16/2013
我已经尝试过[应用程序setStatusBarStyle:UIStatusBarStyleLightContent];但实际上什么都没有变化,文字颜色仍然是黑色的
0赞 Aaron Miller 7/16/2013
我很想提供更多帮助,但就像我说的,我对 iOS 开发过程不够熟悉,不知道该提出什么建议。不好意思!
1赞 Peter B. Kramer 7/21/2013
1) 在 plist 中将 UIViewControllerBasedStatusBarAppearance 设置为 YES 2) 在 viewDidLoad 中执行 [self setNeedsStatusBarAppearanceUpdate];3)添加以下方法:-(UIStatusBarStyle)preferredStatusBarStyle{ return UIStatusBarStyleLightContent;
2赞 AlastairDewar 7/17/2013 #2

这似乎是当前 Xcode 和 iOS 7 版本的问题。

Apple 开发者论坛上的一些相关内容可在 Apple 开发者论坛*(目前有 32 篇文章)的“iOS 7 Beta 宜居性”中搜索 UIStatusBarStyleLightContent

我遇到了它,试图将其设置为轻量级版本。

(这只是 Aaron 回答的后续。

1471赞 Peter B. Kramer 7/21/2013 #3
  1. 在 .plist 文件中设置 to。UIViewControllerBasedStatusBarAppearanceYES

  2. 在 do aviewDidLoad[self setNeedsStatusBarAppearanceUpdate];

  3. 添加以下方法:

    - (UIStatusBarStyle)preferredStatusBarStyle
    { 
        return UIStatusBarStyleLightContent; 
    }
    

注意:这不适用于内部控制器,请参阅下面的泰森评论:)UINavigationController

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

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 7/30/2013
我不需要第 2 步。
42赞 wilsontgh 8/12/2013
似乎不适用于带有 Xcode7-DP5 的 iOS 5 Beta 5。preferredStatusBarStyle 似乎没有被调用。
20赞 parilogic 9/11/2013
UIViewControllerBasedStatusBarAppearance 已更改为 Xcode 5 GM 种子中基于控制器的状态栏外观
44赞 parilogic 9/13/2013
得到了 Xcode GM Seed 的答案: 1. 在 Info.plist 中,将基于控制器的视图状态栏外观设置为 NO 2。在 appDelegate 中,在 appDidFinishLaunching 方法中,将 [[UIView appearance] setTintColor:[UIColor whiteColor]];
111赞 Tyson 10/22/2013
UINavigationController 是特例,以上操作不起作用。只是花了几个小时来挠头。有关解决方案,请参阅此处:stackoverflow.com/a/19513714/505457
867赞 wilsontgh 8/12/2013 #4

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

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

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

评论

18赞 Mick Byrne 8/22/2013
这是一条更好、更容易的路线。
235赞 SwiftArchitect 9/20/2013
无需编码。这一切都可以从 plist 完成:(1) 将“查看基于控制器的状态栏外观”设置为 NO,以及 (2) 将“状态栏样式”设置为“不透明的黑色样式”。(原始值为 UIViewControllerBasedStatusBarAppearance -> NO 和 UIStatusBarStyle -> UIStatusBarStyleBlackOpaque)
4赞 Abhi Beckert 9/30/2013
请注意,必须将相关的 info.plist 值设置为 NO 才能正常工作。
10赞 benka 10/30/2013
@gothicdev:不错的收获。会接受你的答案,因为它是最干净的。条形样式的浅色选项可以是:UIStatusBarStyleLightContent
11赞 lostAtSeaJoshua 7/10/2015
此方法在 iOS 9 中已弃用。
33赞 matt bernardo 8/19/2013 #5

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

-(UIStatusBarStyle)preferredStatusBarStyle{ 
    return UIStatusBarStyleLightContent; 
} 

这应该是你所需要的。

评论

0赞 Johnny Sparks 9/27/2013
这是在无故事板和无 xib 的应用程序中唯一适合我的解决方案。应该对非IB用户也有帮助。
2赞 Ben 10/3/2013
当我需要在每个视图控制器中设置不同的样式时,这对我来说是完美的
0赞 cloudsurfin 3/25/2014
如果要将“查看基于控制器的状态栏外观”设置为“是”,则要这样做。谢谢!
456赞 Lucas 9/11/2013 #6

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

项目 plist 文件上:

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

评论

13赞 Nathan H 9/11/2013
我不知道情况是否发生了变化,但是 XCode 无法识别 UIStatusBarStyleLightContent 值,并且在任何文档中都找不到......虽然它似乎有效。
6赞 viniciusnz 10/30/2013
这个还在启动屏幕上更改了它,而仅仅在导航器上设置它不会......荣誉!
4赞 7wonders 11/6/2013
绝对是完成此操作的最简单方法,如前所述,也适用于启动画面。
5赞 user1949873 2/4/2014
但是,没有任何名称可以执行相同的操作:)另外,您需要添加,因为它最初不存在,并且这是让它:)工作所需的全部内容UIStatusBarStyleLightContentplist infoTransparent BlackView controller-based status bar appearance
49赞 Adam Waite 6/29/2014
对于像我这样的懒惰的人,复制并过去:<key>UIStatusBarStyle</key> <string>UIStatusBarStyleLightContent</string> <key>UIViewControllerBasedStatusBarAppearance</key> <false/>
124赞 haraldmartin 9/13/2013 #7

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

Enter image description here

评论

3赞 MrTJ 9/19/2013
在设备中,上面的答案都不适合我,但这个。我认为它告诉了有关新系统的所有信息,您必须将navigation_bar设置为 BLACK 才能获得status_bar文本 WHITE。
2赞 Kudit 11/18/2013
在经历了很多事情之后,这就是最终奏效的原因。样式设置为默认值。更改了这一点并剥离了所有其他状态栏黑客,它可以工作。
1赞 Steve Moser 3/7/2014
如果您不想在IB中设置所有导航栏,您也可以设置其外观代理。[[UINavigationBar 外观] setBarStyle:UIBarStyleBlack];
3赞 Chris 3/12/2014
在 iOS7 Storyboard 中对我不起作用。看起来这可能是副作用吗?
0赞 Markus 3/23/2015
我想确认一下,以上所有答案对我都不起作用。在图像之后,状态栏文本显示为白色。但我再说一遍,上述 Xcode 6.2 和 iOS 8.2 的答案不起作用。
50赞 Deniss Fedotovs 9/13/2013 #8

这适用于 2013 年 9 月 18 日发布的 Golden Master iOS 7 和 Xcode 5 GM seed 和 iOS7 SDK(至少在隐藏导航控制器的情况下):

  1. 在 中设置为 。the UIViewControllerBasedStatusBarAppearanceNOInfo.plist

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

评论

1赞 Zsolt 9/14/2013
UIViewControllerBasedStatusBarAppearance 默认值似乎是 YES。“应用程序默认使用基于视图控制器的新状态栏管理系统。若要选择退出此功能,请将 UIViewControllerBasedStatusBarAppearance 键的值 NO 添加到 Info.plist。[bgr.com/2013/09/10/ios-7-gm-change-log-release-notes/]
1赞 CashLee李秉骏 9/23/2013
你!!将 UIViewControllerBasedStatusBarAppearance 设置为 NO 后,状态栏将隐藏在视图中。
0赞 Arnlee Vizcayno 9/23/2013
它应该应用于所有 ViewDidLoad 吗?
0赞 Deniss Fedotovs 9/23/2013
您可以只在 appDelegates didFinishLoading 方法中添加它。或者,在第一个视图中,viewDidLoad 方法(如果您不希望它更改)。
1赞 Felipe 1/20/2014
太棒了,这个做到了。简单而出色的编码。
15赞 parilogic 9/16/2013 #9

答案已更新为 Xcode GM Seed:

  1. 输入为Info.plistView controller-based status bar appearanceNO

  2. 在项目中,设置:

    Enter image description here

  3. 在 ViewDidLoad 中:

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

评论

0赞 Keith 9/20/2013
这改变了标签栏,而不是我的状态栏。
10赞 Felipe Antonio Cardoso 9/22/2013 #10

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

在代码没有更改的情况下,我确实像这样配置了我的 .plist 文件:

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

我希望它有所帮助。

编辑

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

251赞 Pradeep Mahdevu 9/23/2013 #11

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

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

在 AppDelegate 中,添加

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

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

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

评论

12赞 sudo make install 8/9/2015
在 iOS 9 中已弃用。:-/
35赞 Mohit Padalia 9/27/2013 #12

如果你的 UIViewController 位于 UINavigationController 中,则必须设置 BarStyle:

-[UINavigationBar setBarStyle:UIBarStyleBlack]

原始答案在这里

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

评论

0赞 wpearse 12/2/2013
不,这只是使导航栏颜色与状态栏文本颜色相同。这隐藏了问题,而不是修复它!
2赞 jonstaff 1/22/2014
在 iOS7 中,如果视图包含 UINavigationController,状态栏将模仿 UINavigationBar,因此在许多情况下,这是正确答案。
13赞 Mohit Tomar 9/27/2013 #13

无需做一些额外的工作,只需在viewController中编写此代码即可,并获得状态栏颜色为白色

- (UIStatusBarStyle)preferredStatusBarStyle{return UIStatusBarStyleLightContent;}

评论

0赞 Phil Mulkins 10/7/2014
实现后将其放在 ViewController.m 下。它最简单,效果很好!谢谢Mohit!
6赞 Juddster 10/17/2013 #14

实现此工作的关键是,只有全屏视图控制器才能决定状态栏的样式。

如果使用导航控制器,并且想要基于每个视图控制器控制状态栏,则需要子类化 UINavigationController 并实现 preferredStatusBarStyle,以便它返回 topViewController 的首选项。

请确保将情节提要场景中的类引用从 UINavigationController 更改为子类(例如,以下示例中的 MyNavigationController)。

(以下内容对我有用。如果您的应用程序是基于 TabBar 的,您将希望通过子类化 UITabBarController 来执行类似操作,但我还没有尝试过)。

@interface MyNavigationController : UINavigationController

@end

@implementation MyNavigationController

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return self.topViewController.preferredStatusBarStyle;
}

@end
2赞 VarshaSai 10/29/2013 #15
  • 删除 .plist 文件中基于视图控制器的状态栏外观(如果已创建),然后重新创建。

  • 状态栏样式设置为不透明的黑色样式

在 appDelegate 中,在 didFinishLaunching 下添加以下代码。

 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
11赞 Cagdas Altinkaya 11/11/2013 #16

只需调用

[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];

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

我在 iOS7 中对我有用的方法。AppDelegate

评论

0赞 Ethan Parker 1/29/2015
哇,这里有很多废话,但这个答案对我有用。我正在使用 Xcode 6 和 iOS 8 SDK
1赞 dstudeba 10/19/2015
太好了,在 iOS 9 中对我有用View controller-based status bar appearance = NO
5赞 Dima Deplov 11/14/2013 #17

您可以从 info.plist 执行此操作:

1) “查看基于控制器的状态栏外观”设置为“否”

2)“状态栏样式”设置为“UIStatusBarStyleLightContent”

1赞 poGUIst 11/19/2013 #18

在 iOS 7 上,如果要使用 UIViewControllerBasedStatusBarAppearance == YES,并且根视图控制器是 UINavigationController,则应 子类化 it 并重载 childViewControllerForStatusBarStyle,例如,如下所示:

- (UIViewController*) childViewControllerForStatusBarStyle
{
    return self.viewControllers.lastObject;
}

在此之后,将在推送的视图控制器上调用 preferredStatusBarStyle。

1赞 Arash Zeinoddini 11/27/2013 #19

您可以将其用于 iOS 6 和 7:

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

[[UIApplication sharedApplication] setStatusBarStyle:STATUS_STYLE animated:YES];
20赞 Josh Earl 12/10/2013 #20

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

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

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

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

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

要禁用逐视图状态栏控件,您需要在 中设置该属性。View controller-based status bar appearanceInfo.plist

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

将鼠标悬停在某一行上,然后单击出现的加号以向 ..plist

输入“键”字段,然后确保“类型”字段设置为 。最后,输入“值”字段。View controller-based status bar appearanceBooleanNO

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

下面是一篇博客文章,其中包含更多详细信息和一些示例代码:

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

评论

0赞 Chris Prince 6/23/2014
谢谢。我的问题是我没有看到“基于视图控制器的状态栏外观”的类型设置为字符串。“手动”编辑 .plist 文件并输入布尔值可以解决问题。
54赞 folse 12/21/2013 #21

只需两个步骤如下:

步骤1:

在 的“信息”选项卡下,添加行:project target

UIViewControllerBasedStatusBarAppearance,设置值。NO

步骤2:

在项目中:AppDelegate.m

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

评论

4赞 MUH Mobile Inc. 2/13/2014
我喜欢这个答案,因为这是我第一次使用“应用程序”参数))
0赞 E. Rivera 4/16/2014
点符号,这将是完美的;)
106赞 stepik21 12/29/2013 #22

这些都不适合我,所以这里有一个可行的解决方案......

在 中,添加一行:Info.plist

UIViewControllerBasedStatusBarAppearance,并设置值 。NO

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

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

评论

0赞 John Contarino 6/6/2016
这个解决方案对我有用,而上面的解决方案则无效。
0赞 Abhishek Thapliyal 6/17/2016
太棒了,但这个 UIViewControllerBasedStatusBarAppearance 转换为相同的:查看基于控制器的状态栏外观 自动:)
21赞 Shahid Iqbal 1/10/2014 #23

嗯,这对我来说真的是小菜一碟。

转到应用的 .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赞 user2387149 6/19/2014
我认为这是正确答案(plist 的一部分)......为什么我要在 didfinishlaunchingwithoptions 上添加静态代码...如果您需要整个应用程序相同的颜色,这是正确的方法
24赞 Vivek Sehrawat 1/17/2014 #24

只需在应用内委托:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

Swift 5 中,请按照以下步骤操作:

  1. 在 Info.plist 中添加键并设置值UIViewControllerBasedStatusBarAppearancefalse
  2. 添加键并将值设置为UIStatusBarStyleUIStatusBarStyleLightContent

评论

5赞 Wim Haanstra 2/7/2014
唯一一个真正对我有用的答案。
6赞 iamyogish 2/12/2014
但为此,我们需要选择退出 查看基于控制器的状态栏外观 .
0赞 Dimitris 4/29/2016
在 iOS9 中已弃用
2赞 Paul 1/28/2014 #25

这对我有用:

  1. 将 to 在UIViewControllerBasedStatusBarAppearanceYESplist

  2. 需要方法实现rootViewController

    -(UIStatusBarStyle)preferredStatusBarStyle
    

因为我是由 Cocoapods () 管理的,所以我通过一个类别添加了这个方法:rootViewControllerJASidePanelController

#import "JASidePanelController+StatusBarStyle.h"

@implementation JASidePanelController (StatusBarStyle)

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

@end
7赞 Ramdhas 7/19/2014 #26

在 Plist 中,添加以下内容:

  • 状态栏样式:UIStatusBarStyleLightContent
  • 查看基于控制器的状态栏外观:NO
30赞 fancoolo 8/21/2014 #27

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

这是我所做的,它有效:

信息.plist:

Enter image description here

评论

2赞 Dekel Maman 9/8/2014
谢谢,看起来只有您的解决方案才能与IOS7的最新版本一起使用
0赞 Juan Boero 11/20/2015
此解决方案在加载应用程序时在启动屏幕中显示状态栏。
0赞 Michael 11/29/2015
解决了我在 xCode 7.1 中的问题。最新版本。苹果忘记了几个关键部分来使某些东西发挥作用。再。
5赞 Marcelo dos Santos 9/2/2014 #28

对于 Xcode 5.1:

在 .plist 中将“查看基于控制器的状态栏外观”添加到 NO

在 AppDelegate 中,添加:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

就这样!

24赞 neo D1 9/6/2014 #29

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

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

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

} 

在 Plist 文件中,将“查看基于控制器的状态栏外观”设置为“否”。

9赞 budiDino 10/8/2014 #30

总而言之,编辑您的项目并添加:Info.plist

View controller-based status bar appearance:NO

Status bar style:Opaque black style

或者,如果您有原始键/值 plist

UIViewControllerBasedStatusBarAppearance:NO

UIStatusBarStyle:Opaque black style

评论

0赞 nburk 11/30/2014
这对我有用,而且比使用更麻烦,因为您可以全局配置它(当然,这只适合您的情况)preferredStatusBarStyle
9赞 eirik 2/5/2015 #31

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

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

评论

0赞 Michael Peterson 3/12/2015
导航栏 != 状态栏。
0赞 eirik 3/13/2015
...你试过了吗!?(是的,对于状态栏)
10赞 parvind 3/30/2015 #32

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

评论

2赞 tommybananas 7/28/2015
优胜者 优胜者 鸡肉晚餐
7赞 Amit Shelgaonkar 7/1/2015 #33

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

如果您尝试通过选择视图控制器并转到右侧的模拟指标来将 Storyboard 中的颜色从黑色更改为白色,它将不起作用,我不知道为什么。它应该通过像这样改变来工作,但无论如何。

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

iOS 7 状态栏文本颜色

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

     [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

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

评论

0赞 Trung Bui 2/6/2016
此方法在 iOS 9 上已弃用
13赞 Fawkes 9/17/2015 #34

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

根据您需要状态栏指示灯样式的位置,您应该始终牢记以下 3 点:

1)如果您需要启动屏幕或其他无法控制它的位置的状态栏(不是在视图控制器中,而是在一些系统控制的元素/时刻,如启动屏幕)中,请转到项目设置Project settings

2) 如果导航控制器内部有控制器,则可以在界面构建器中更改它,如下所示:

a) 选择导航控制器的导航栏Select the navigation bar of your navigation controller

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

enter image description here

或者按如下方式在代码中执行

navigationController?.navigationBar.barStyle = UIBarStyle.Black

3) 如果你只有控制器,它需要有自己的状态栏样式,并且它没有作为 UINavigationController 嵌入到某些容器结构中

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

Setting the status bar style in code

评论

0赞 Fawkes 11/30/2015
请解释您的情况,我会尽力提供帮助
1赞 Michael 11/30/2015
我必须将 StatusBarIsIntiallyHidden = NO 添加到 plist 中,并将 ViewControllerBasedApplicationStatusBarAppearnce = NO 添加到 plist。然后,这适用于第一部分
0赞 Fawkes 11/30/2015
您是否有一个与第一个加载视图控制器具有相同“图像”的初始屏幕?此外,在目标的“信息”部分,您可以尝试将“隐藏状态栏”设置为 false,并避免处理您的 .plist。“StatusBarIsIntiallyHidden”标志
0赞 Michael 11/30/2015
我没有。它使用生成的默认 xib。
0赞 Michael 11/30/2015
我实际上在 xCode 7.1 中创建一个新项目时发现了这个问题,这就是为什么我认为它如此奇怪
0赞 Fahim Parkar 10/6/2015 #35

如果要将其设置为任何颜色,请使用以下代码。

id statusBarWindow = [[UIApplication sharedApplication] valueForKey:@"statusBarWindow"];
id statusBar = [statusBarWindow valueForKey:@"statusBar"];

SEL setForegroundColor_sel = NSSelectorFromString(@"setForegroundColor:");
if([statusBar respondsToSelector:setForegroundColor_sel]) {
    // iOS 7+
    [statusBar performSelector:setForegroundColor_sel withObject:YourColorHere];
                                                                 ^^^^^^^^^^^^^
}

我知道我正在访问私有 API,但我在许多项目中都使用了它,并且 Apple 已经批准了它。

在提交应用程序时,请在“评论”部分将此代码发送给 Apple,并通知您正在使用此代码更改状态栏颜色。

是的也不要忘记下面。

评论

0赞 אורי orihpt 12/4/2020
我怎样才能在 Swift 中做到这一点?
4赞 S. Matsepura 10/8/2015 #36

在 iOS 8 中: 搭NavigationController.NavigationBar.BarStyle = UIBarStyle.Black;viewDidLoad

4赞 Alexander Khitev 10/16/2015 #37

如果我使用 UINavigationController,我会在 iOS 9 和 Swift 2.0 中做到这一点

self.navigationController?.navigationBar.barStyle = UIBarStyle.Black

如果我使用模态 segue,我会这样做

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return .LightContent
}
4赞 Patel Jigar 11/18/2015 #38

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

在 AppDelegate 中,添加

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
3赞 Konstantine Kalbazov 12/9/2015 #39

如果应用程序默认需要,但你仍希望能够在某些屏幕上使用,则可以选择在控制器级别管理状态栏颜色,但在这种情况下,必须在每个视图控制器中覆盖它(或在基本视图控制器中实现它,所有其他视图控制器都将从该控制器继承)。这是解决此问题的另一种方法:UIStatusBarStyleLightContentUIStatusBarStyleDefaultpreferredStatusBarStyle

  • 在 plist 中设置 toUIViewControllerBasedStatusBarAppearanceNO
  • UIStatusBarStyleUIStatusBarStyleLightContent

所有视图控制器都将使用白色文本作为状态栏。现在,仅在需要带有黑色文本的状态栏的视图控制器中添加此方法:

-(void)viewWillAppear:(BOOL)animated  
{  
  [super viewWillAppear:animated];  
  [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
}    

-(void)viewWillDisappear:(BOOL)animated  
{  
  [super viewWillAppear:animated];  
  [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}    
9赞 fraxool 1/11/2016 #40

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

UINavigationBar.appearance().barStyle = .BlackTranslucent

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

84赞 Ajinkya Patil 2/9/2016 #41

您无需为此执行任何代码

您需要在 info.plist 中添加“查看基于控制器的状态栏外观”键,如下所示:enter image description here

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

enter image description here

就是这样。

评论

1赞 Igor de Lorenzi 2/13/2016
我喜欢你的方法!就我而言,我试图弄清楚如何使状态栏样式仅在全屏(无导航栏)时才变浅。然后,我意识到所有其他屏幕都应该适合相同的灯光风格。因此,一个好的解决方案是为整个事情设置。谢谢!(:
0赞 Michael 5/25/2016
如果在应用运行时不需要更改此设置。这是最好的方法。
0赞 Chitranshu Asthana 12/2/2016
这种方法肯定有效,但它在iPad上引入了一个奇怪的问题。如果您的应用程序支持深度链接,并且当您通过深度链接启动应用程序时,状态栏上显示的反向链接将消失。
0赞 Amit Kumar 7/28/2017
最好和最简单的一个。
0赞 Gold Chicken 7/8/2019
对我来说最好的解决方案:D
2赞 IOS developer 4/27/2016 #42

只需更改 1) 查看基于控制器的状态栏 -> 并写入 2)Info.plistappearanceNO

  [[UIApplication
 sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent]; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
27赞 Wanbok Choi 5/31/2016 #43
  1. 转到 -> ,ProjectTarget

  2. 然后设置为 。它使启动屏幕的状态栏变白。Status Bar StyleLightProject Setting

  3. 然后将 等于 设置为 。View controller-based status bar appearanceNOInfo.plist

评论

2赞 Will 6/4/2016
你设置实际的第二部分是我缺少的部分。谢谢View controller-based status bar appearance equalNO
0赞 Chris 1/2/2022
完美,在我看来应该是最正确的答案。谢谢
3赞 Mahendra Liya 6/23/2016 #44

从 Xcode(无需任何编码)执行此操作的最简单方法是:

  • 添加到 Info.plist 并将值设置为 .View controller-based status bar appearanceNO
  • 现在,转到您的项目目标,在里面您会找到一个选项。将此选项的值设置为 。Deployment InfoStatus Bar StyleLight

您将拥有状态栏。White

1赞 Cmar 10/13/2016 #45

我必须为 swift 和导航控制器做些什么

extension UINavigationController {
    override open var preferredStatusBarStyle: UIStatusBarStyle {
       return .lightContent
    }   
}
6赞 Mohammad Zaid - LushBinary.com 12/19/2016 #46

Swift 3 - Xcode 8.

如果您希望状态栏最初隐藏在启动屏幕上,请尝试以下操作,

步骤1:将以下内容添加到 。info.plist

  • View controller-based status bar appearance价值NO
  • Status bar is initially hidden价值YES

步骤2:在方法中写这个。didFinishLaunchingWithOptions

UIApplication.shared.isStatusBarHidden = false
UIApplication.shared.statusBarStyle = UIStatusBarStyle.lightContent
-4赞 Khurshid 3/8/2017 #47

非常简单的方法:更改状态栏颜色。 创建导航控制器的子类。

在 view didload 方法中编写此代码。 在所有视图控制器中影响此代码

self.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName :
                                                                        [UIColor whiteColor],
                                               NSFontAttributeName:[UIFont boldSystemFontOfSize:19]};

评论

3赞 Lescai Ionel 3/22/2017
问题指的是状态栏,而不是导航栏。
25赞 James Rochabrun 3/28/2017 #48

Change in info PLIST在 Swift 3 中,只需 2 个步骤即可轻松完成。 转到 info.plist 并将密钥更改为“NO”。 然后在 Appdelegate 中,只需在 didfinishlaunchingwithoptions 方法中添加此行View controller-based status bar appearance

  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 9/1/2017
这真是太棒了,兄弟:)谢谢。
0赞 James Rochabrun 1/5/2019
这样做在 iOS 9 中已被弃用,应该在 rootviewcontroller 覆盖 var preferredStatusBarStyle 上执行此操作: UIStatusBarStyle { return .lightContent }
4赞 Datt Patel 6/21/2017 #49

更改所有 ViewController 的状态栏文本颜色

斯威夫特 3

if View 基于控制器的状态栏外观 = Info.plist 中的 YES

然后将此扩展用于所有 NavigationController

extension UINavigationController
{
    override open var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
     }
 }

如果没有 UINavigationController,只有 UIViewController,则使用以下代码:

extension UIViewController
{
    override open var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
     }
 }

目标 C

创建类别类

对于 UIViewController

在 UIViewController+StatusBarStyle.h 中

 @interface UIViewController (StatusBarStyle)
 @end

在 UIViewController+StatusBarStyle.m 中

 #import "UIViewController+StatusBarStyle.h"

 @implementation UIViewController (StatusBarStyle)
 -(UIStatusBarStyle)preferredStatusBarStyle
 {
  return UIStatusBarStyleLightContent;
 }
 @end 

对于 UINavigationController

在 UINavigationController+StatusBarStyle.h 中

 @interface UINavigationController (StatusBarStyle)
 @end

在 UINavigationController+StatusBarStyle.m 中

 #import "UINavigationController+StatusBarStyle.h"

 @implementation UINavigationController (StatusBarStyle)
 -(UIStatusBarStyle)preferredStatusBarStyle
 {
  return UIStatusBarStyleLightContent;
 }
 @end  
1赞 Karthick C 10/7/2017 #50

请试试这个

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    [application setStatusBarHidden:NO];
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
    if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
        statusBar.backgroundColor = [UIColor blackColor];
    }
13赞 Krunal 10/17/2017 #51

这是有关状态栏更改的 Apple 指南/说明。状态栏中只允许深色和浅色(而黑色)和黑色。

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

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

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

  1. 如果只需要在 UIViewController 级别设置状态栏样式,请在文件中设置 to。UIViewControllerBasedStatusBarAppearanceYES.plist
  2. 在 viewDidLoad 添加函数中 -setNeedsStatusBarAppearanceUpdate

  3. 在视图控制器中覆盖 preferredStatusBarStyle。

-

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

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

根据状态栏样式设置级别设置 .plist 的值。enter image description here


这里有一些技巧,可以在应用程序启动期间或视图控制器的 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
    }

}



结果如下:

enter image description here

8赞 Andrew Kirna 10/23/2019 #52

iOS 13 解决方案

UINavigationController是(谁知道🙃)的子类!UIViewController

因此,在显示导航控制器中嵌入的视图控制器时,您并没有真正呈现嵌入式视图控制器;您正在展示导航控制器!,作为 的子类 继承 和 ,您可以根据需要进行设置。UINavigationControllerUIViewControllerpreferredStatusBarStylechildForStatusBarStyle

以下任何方法都应该有效:

  1. 选择完全退出深色模式
    • 在 中,添加以下属性:info.plist
      • 键 - (又名。“用户界面样式”)UIUserInterfaceStyle
      • 价值 - 轻
  2. 重写 UINavigationController 中的 preferredStatusBarStyle

    • preferredStatusBarStyle (文档)- 视图控制器的首选状态栏样式
    • 子类或扩展UINavigationController

      class MyNavigationController: UINavigationController {
          override var preferredStatusBarStyle: UIStatusBarStyle {
              .lightContent
          }
      }
      

      extension UINavigationController {
          open override var preferredStatusBarStyle: UIStatusBarStyle {
              .lightContent
          }
      }
      
  3. 重写 UINavigationController 中的 childForStatusBarStyle

    • childForStatusBarStyle (文档)- 当系统需要视图控制器用于确定状态栏样式时调用
    • 根据 Apple 的文档,

      “如果容器视图控制器从其子视图控制器之一派生其状态栏样式,则 [覆盖此属性] 并返回该子视图控制器。如果返回 nil 或不重写此方法,则使用 self 的状态栏样式。如果此方法的返回值发生更改,请调用 setNeedsStatusBarAppearanceUpdate() 方法。

    • 换言之,如果不在此处实现解决方案 3,系统将回退到上述解决方案 2。
    • 子类或扩展UINavigationController

      class MyNavigationController: UINavigationController {
          override var childForStatusBarStyle: UIViewController? {
              topViewController
          }
      }
      

      extension UINavigationController {    
          open override var childForStatusBarStyle: UIViewController? {
              topViewController
          }
      }
      
    • 您可以返回上面想要的任何视图控制器。我推荐以下方法之一:

      • topViewController(的)(doc) - 导航堆栈顶部的视图控制器UINavigationController
      • visibleViewController(的)(doc) - 与导航界面中当前可见视图关联的视图控制器(提示:这可以包括“在导航控制器本身之上以模式方式呈现的视图控制器”)UINavigationController

注意:如果您决定对 UINavigationController 进行子类化,请记住通过 IB 中的身份检查器将该类应用于导航控制器。

PS 这适用于 iOS 13 😎

11赞 superm0 3/1/2020 #53

在我的 Swift 5 案例中,我添加了以下几行:

override func viewDidAppear(_ animated: Bool) {
    navigationController?.navigationBar.barStyle = .black
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

评论

0赞 Tilo Delau 11/4/2020
preferredStatusBarStyle 没有做任何事情。.black 可以进入 viewDidLoad 就好了。
-2赞 Divya Vohra 3/17/2020 #54
extension UIApplication {

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

评论

0赞 economy 3/18/2020
您能解释一下为什么会这样吗?
0赞 Ucdemir 12/19/2020 #55

这是一个更好的解决方案 扩展导航控制器并放入情节提要

class NVC: UINavigationController {

    override var preferredStatusBarStyle: UIStatusBarStyle {
              return .lightContent
    }

    override func viewDidLoad() {
        super.viewDidLoad()

    self.navigationBar.isHidden = true
    self.navigationController?.navigationBar.isTranslucent = false
      
     self.navigationBar.barTintColor = UIColor.white
     setStatusBarColor(view : self.view)
    }
    

    func setStatusBarColor(view : UIView){
             if #available(iOS 13.0, *) {
                 let app = UIApplication.shared
                 let statusBarHeight: CGFloat = app.statusBarFrame.size.height
                 
                 let statusbarView = UIView()
              statusbarView.backgroundColor = UIColor.black
                 view.addSubview(statusbarView)
               
                 statusbarView.translatesAutoresizingMaskIntoConstraints = false
                 statusbarView.heightAnchor
                     .constraint(equalToConstant: statusBarHeight).isActive = true
                 statusbarView.widthAnchor
                     .constraint(equalTo: view.widthAnchor, multiplier: 1.0).isActive = true
                 statusbarView.topAnchor
                     .constraint(equalTo: view.topAnchor).isActive = true
                 statusbarView.centerXAnchor
                     .constraint(equalTo: view.centerXAnchor).isActive = true
               
             } else {
                 let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView
              statusBar?.backgroundColor = UIColor.black
             }
         }
}

状态栏颜色为黑色,文本为白色

评论

0赞 Muhammad Danish Qureshi 6/29/2022
干得好,我尊重你的解决方案,但我不会向任何人推荐这个解决方案,我看到很多次开发人员添加了一个具有继承的新类,并在代码中使用该说唱歌手类(主要是为标签和导航控制器编写)。在我的建议中,我们不应该编写包装类来实现此功能,我们总是使用它的扩展或使用本机行为来解决此类问题。我希望你不介意我的意见。谢谢。
1赞 heiko 3/23/2021 #56

此解决方案适用于使用新版 SwiftUI 生命周期/iOS 14.0 的 App:

我需要动态更改状态栏文本颜色,但无法访问,因为 SwiftUI 生命周期不存在。window.rootViewControllerSceneDelegate

我终于找到了 Xavier Donnellon 的这个简单解决方案: https://github.com/xavierdonnellon/swiftui-statusbarstyle

将文件复制到项目中,并将主视图包装成一个:StatusBarController.swiftRootView

@main
struct ProjectApp: App {     
    var body: some Scene {
        WindowGroup {
            //wrap main view in RootView
            RootView {
                //Put the view you want your app to present here
                ContentView()
                    //add necessary environment objects here 
            }
        }
    }
}

然后,您可以通过使用 或 view 修饰符或调用 径直。.statusBarStyle(.darkContent).statusBarStyle(.lightContent)UIApplication.setStatusBarStyle(.lightContent)

不要忘记在 Info.plist 中将“查看基于控制器的状态栏外观”设置为“是”。

21赞 Eric33187 4/3/2021 #57

Xcode 似乎不断改变这一点,所以这是最新的。

截至 2021 年 - Swift 5、Xcode 12

要将状态栏更改为白色,请执行以下操作:

  1. 打开 Info.plist
  2. 添加键并将值设置为 (false)。人类可读的版本是 .UIViewControllerBasedStatusBarAppearanceNo"View controller-based status bar appearance"
  3. 添加键并将值设置为(即 )。UIStatusBarStyleUIStatusBarStyleLightContent"Light Content"

评论

1赞 FontFamily 5/20/2021
这对我有用,也是最容易遵循的。
3赞 nastassia 9/16/2021 #58

就我而言,没有任何帮助。我试图在嵌入 中的颜色处更改颜色,而 又以模态方式呈现。这种方式不起作用:StatusBarViewController2NavigationControllerViewController1

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .darkContent
}

什么也没发生,直到我找到这个解决方案: 添加到这一行 -ViewController1

navigationController.modalPresentationCapturesStatusBarAppearance = 真

let navigationController = UINavigationController(rootViewController: viewController2)
navigationController.modalPresentationStyle = .overFullScreen
navigationController.modalTransitionStyle = .crossDissolve           
navigationController.modalPresentationCapturesStatusBarAppearance = true
self.present(navigationController, animated: true)

因此,如果您有类似于 的导航方案,请尝试所呈现的导航方案的属性ViewController1 presented ViewController2modalPresentationCapturesStatusBarAppearance

文档:

此属性的默认值为 false。

当您通过调用 present(_:animated:completion:) 方法,状态栏外观控件 从呈现的视图控制器传输到呈现的视图控制器 仅当提供的控制器的 modalPresentationStyle 值为 UIModalPresentationStyle.fullScreen。 通过将此属性设置为 true, 指定显示的视图控制器控件状态栏 外观,即使以非全屏方式呈现。

系统忽略视图控制器的此属性值 全屏呈现。

2赞 Muhammad Danish Qureshi 12/3/2021 #59

这个答案是在hackingwithswift网站的帮助下

适用于 iOS (13, *)

有时我们需要不同颜色的状态栏,例如,对于一个 ViewController,我们需要黑色状态栏,对于第二个 ViewController,我们需要白色状态栏。 现在我们要做什么? 我们需要在 ViewController 中添加这种代码的和平

    // MARK: - Variables
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
    // MARK: - View Life Cycle
    override func viewDidAppear(_ animated: Bool) {
        setNeedsStatusBarAppearanceUpdate()
    }

此代码将更改该特定 ViewController 中状态栏的浅色或白色。我们可以在preferredStatusBarStyle中将其更改为.dark

有关更多详细信息,请访问 hackingwithswift

2赞 Saranjith 6/8/2023 #60

iOS 17+ 更新

考虑其下的应用程序,并由操作系统本身自动修改状态栏样式。