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

我的应用程序有一个深色的背景,但在iOS7状态栏变成了透明的。所以我看不到任何东西,只有绿色的电池指示灯在角落里。我怎么能改变状态栏文本颜色为白色,就像在主屏幕上一样?

655711 次浏览

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

因为状态栏是透明的,所以它后面的视图会显示出来。[…]使用UIStatusBarStyle常量来指定状态栏内容应该是深色还是浅色:

UIStatusBarStyleDefault显示黑暗内容。[…]

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

也可能感兴趣:

在iOS7中,您可以从单个vew控制器控制状态栏的样式,并在应用程序运行时更改它。要选择加入此行为,请将UIViewControllerBasedStatusBarAppearance键添加到应用程序的Info.plist文件并赋予其值YES

我绝对建议您查看该文档,您可以使用您的Apple开发者ID访问该文档。

这似乎是Xcode和iOS7当前版本的一个问题。

Apple开发者论坛上的一些相关内容位于在Apple开发者论坛的“iOS7 Beta Livability”中搜索UIStatusBarStyleLightContent*(目前有32个帖子)。

我偶然发现它试图将其设置为轻版本。

(这只是对亚伦答案的跟进。

  1. 将. plist文件中的UIViewControllerBasedStatusBarAppearance设置为YES

  2. viewDidLoad[self setNeedsStatusBarAppearanceUpdate];

  3. 添加以下方法:

    - (UIStatusBarStyle)preferredStatusBarStyle{return UIStatusBarStyleLightContent;}

Note: This does not work for controllers inside UINavigationController, please see Tyson's comment below :)

Swift 3 - This will work controllers inside UINavigationController. Add this code inside your controller.

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

Swift 5和SwiftUI

为SwiftUI创建一个名为HostingController.swift的新Swift文件

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

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

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

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

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

  1. 在你的Info.plist中设置View controller-based status bar appearanceNO
  2. 呼叫[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

注意:此方法已在iOS9中弃用。改用UIViewController上的preferredStatusBarStyle。(见苹果开发者库

如果您有通过界面生成器创建的嵌入式导航控制器,请务必在管理导航控制器的类中设置以下内容:

-(UIStatusBarStyle)preferredStatusBarStyle{return UIStatusBarStyleLightContent;}

这应该是所有你需要的。

您可以在不编写任何代码的情况下完成此操作!
执行以下操作,使状态栏文本颜色为白色通过整个应用程序

关于你项目列表文件:

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

对我来说,使用其他答案(和其他来源/留档)中的所有内容没有任何问题。有帮助的是在XIB中将导航栏样式设置为“黑色”。这将文本更改为白色,根本没有任何代码。

在此处输入图像描述

这适用于Golden MasteriOS7和Xcode 5 GM种子和2013年9月18日发布的iOS7 SDK(至少隐藏了导航控制器):

  1. the UIViewControllerBasedStatusBarAppearance设置为NOInfo.plist.

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

Xcode GM Seed的更新答案:

  1. Info.plist中,把View controller-based status bar appearance作为NO

  2. 在项目中,设置:

    在此处输入图片描述

  3. 在视图中:

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

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

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

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

希望有帮助。

编辑

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

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

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

在代理中添加

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

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

此解决方案适用于iOS7/8。

如果你的UIViewController在UINavigationController中,你必须设置BarStyle:

-[UINavigationBar setBarStyle:UIBarStyleBlack]

原始答案在这里

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

不需要做一些额外的,只需在您的viewController中编写此代码并获得状态栏颜色白色

- (UIStatusBarStyle)preferredStatusBarStyle{return UIStatusBarStyleLightContent;}

使这项工作的关键是只有全屏视图控制器才能决定状态栏的样式。

如果您正在使用导航控制器并希望在每个视图控制器的基础上控制状态栏,您需要子类化UINavigationController并实现preferredStatusBarStyle,以便它返回topViewController的首选项。

确保将故事板场景中的类引用从UINavigationController更改为子类(例如下面示例中的MyNavigationController)。

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

@interface MyNavigationController : UINavigationController
@end
@implementation MyNavigationController
- (UIStatusBarStyle)preferredStatusBarStyle{return self.topViewController.preferredStatusBarStyle;}
@end
  • 删除. plist文件中的基于视图控制器的状态栏外观(如果您创建了)并重新创建它。

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

在app中,在didFinishLaunsing下添加以下代码。

 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

只是打电话

[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];

在该

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

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

您可以从info.plist:

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

2)状态栏样式设置为UIStatusBarStyleLightContent

完成

在iOS7,如果你想使用UIViewControlllerBasedStatusBar的外观==YES,并且你的根视图控制器是UINavigationController,你应该子类化它并重载儿童ViewControlllerForStatusBarStyle,例如,像这样:

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

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

你可以用它来iOS6和7:

#ifdef __IPHONE_7_0# define STATUS_STYLE UIStatusBarStyleLightContent#else# define STATUS_STYLE UIStatusBarStyleBlackTranslucent#endif
[[UIApplication sharedApplication] setStatusBarStyle:STATUS_STYLE animated:YES];

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

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

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

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

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

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

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

将鼠标悬停在一行上,然后单击出现的加号,将新属性添加到.plist

在Key字段中输入View controller-based status bar appearance,然后确保Type字段设置为Boolean。最后,在Value字段中输入NO

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

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

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

只需以下两个步骤:

步骤1:

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

UIViewControllerBasedStatusBarAppearance,设置值NO

步骤2:

在项目AppDelegate.m中:

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

这些都不适合我,所以这里有一个工作解决方案…

Info.plist中,添加一行:

UIViewControllerBasedStatusBarAppearance,并设置值NO

然后在didFinishLaunchingWithOptions中的App委托中,添加这些行:

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

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

转到您的应用程序的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];}

答对了。对我有用。

简单地在应用程序代表中:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

Swift5中,按照以下步骤操作:

  1. 在Info.plist中添加键UIViewControllerBasedStatusBarAppearance并将值设置为false
  2. 添加键UIStatusBarStyle并将值设置为UIStatusBarStyleLightContent

这对我有效:

  1. plist中将UIViewControllerBasedStatusBarAppearance设置为YES

  2. rootViewController需要方法实现

    -(UIStatusBarStyle)preferredStatusBarStyle

Because my rootViewController is managed by Cocoapods (JASidePanelController) I added this method through a category:

#import "JASidePanelController+StatusBarStyle.h"
@implementation JASidePanelController (StatusBarStyle)
- (UIStatusBarStyle)preferredStatusBarStyle{return UIStatusBarStyleLightContent;}
@end

在Plist中,添加以下内容:

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

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

这就是我所做的,它奏效了:

info.plist:

在此处输入图像描述

对于Xcode 5.1:

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

在App的代理中,添加:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

就这些了!

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

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

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

总结一下,编辑您的项目Info.plist并添加:

View controller-based status bar appearanceNO

Status bar styleOpaque black style

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

UIViewControllerBasedStatusBarAppearanceNO

UIStatusBarStyleOpaque black style

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

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

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

让我给你一个完整的答案,你的问题。更改状态栏文本颜色是非常容易的,但它有点混乱,在iOS7特别是新手。

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

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

iOS 7状态栏文本颜色

最后,您必须转到您的App代理. m文件并在didFinishLaunchingWith Options方法中添加以下内容,添加以下行:

     [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

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

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

根据您需要状态栏灯光样式的位置,您应该始终记住这3点:

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

2)如果导航控制器中有一个控制器您可以在接口生成器中更改它,如下所示:

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

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

在此处输入图片描述

或者用代码做,如下所示

navigationController?.navigationBar.barStyle = UIBarStyle.Black

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

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

在代码中设置状态栏样式

如果您想将其设置为任何颜色,请使用下面的代码。

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,并通知您正在使用此代码更改状态栏颜色。

是的下面也别忘了。

iOS8:将NavigationController.NavigationBar.BarStyle = UIBarStyle.Black;添加到viewDidLoad

我使这在iOS9和Swift 2.0如果我使用UINavigation控制器

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

如果我使用模态序列,我会做这个

override func preferredStatusBarStyle() -> UIStatusBarStyle {return .LightContent}

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

在代理中添加

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

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

  • 在plist中设置UIViewControllerBasedStatusBarAppearanceNO
  • UIStatusBarStyle设置为UIStatusBarStyleLightContent

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

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

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

UINavigationBar.appearance().barStyle = .BlackTranslucent

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

你不需要为此做任何代码

您需要在info.plist中添加“查看基于控制器的状态栏外观”键,如下所示:输入图片描述

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

在此处输入图像描述

就这样。

只需更改1)Info.plist查看基于控制器的状态栏appearance->NO和写(2)强

  [[UIApplicationsharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  1. 转到Project->Target

  2. 然后将Status Bar Style设置为Light。它使状态栏从启动屏幕变为白色。项目设置

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

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

  • View controller-based status bar appearance添加到您的Info.plist并将值设置为NO
  • 现在,转到您的项目目标,在Deployment Info中您将找到Status Bar Style的选项。将此选项的值设置为Light

您将拥有White状态栏。

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

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

Swift 3-Xcode 8。

如果您想在启动屏幕上将状态栏设置为最初隐藏,请尝试此操作,

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

  • View controller-based status bar appearanceNO
  • Status bar is initially hiddenYES

步骤2:将此写入didFinishLaunchingWithOptions方法。

UIApplication.shared.isStatusBarHidden = falseUIApplication.shared.statusBarStyle = UIStatusBarStyle.lightContent

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

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

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

更改信息PLIST在Swift 3中非常简单,只需2个步骤。转到您的info.plist并将键View controller-based status bar appearance更改为“否”。然后在App委托中,只需将这行添加到didfinish释放与选项方法

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

这在iOS9中已被弃用,现在你应该在rootview控制器中覆盖此属性

这样做已被弃用在iOS9应该在rootview控制器上这样做

override var preferredStatusBarStyle: UIStatusBarStyle {return .lightContent}

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

斯威夫特3

如果查看基于控制器的状态栏外观=是Info.plist

然后将此扩展用于所有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

请试试这个

[[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];}

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

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

如果您想设置状态栏样式,请在“. plist”文件中设置UIViewControllerBasedStatusBarAppearanceNO

如果您想设置状态栏样式,在视图控制器级别,然后按照以下步骤操作:

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

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

-

override func viewDidLoad() {super.viewDidLoad()self.setNeedsStatusBarAppearanceUpdate()}
override var preferredStatusBarStyle: UIStatusBarStyle {return .lightContent}

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


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

extension UIApplication {
var statusBarView: UIView? {return value(forKey: "statusBar") as? UIView}
}
// Set upon application launch, if you've application based status barclass AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {UIApplication.shared.statusBarView?.backgroundColor = UIColor.redreturn true}}

or// Set it from your view controller if you've view controller based statusbarclass ViewController: UIViewController {
override func viewDidLoad() {super.viewDidLoad()
UIApplication.shared.statusBarView?.backgroundColor = UIColor.red}
}



结果如下:

输入图片描述

iOS13解决方案

UINavigationControllerUIViewController的子类(谁知道🙃)!

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

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

  1. 完全选择退出黑暗模式
    • info.plist中,添加以下属性:
      • Key-UIUserInterfaceStyle(又名“用户界面风格”)
      • 值-光
  2. 覆盖#1内的#0

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

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

      extension UINavigationController {open override var preferredStatusBarStyle: UIStatusBarStyle {.lightContent}}
  3. Override childForStatusBarStyle within UINavigationController

    • childForStatusBarStyle (doc) - Called when the system needs the view controller to use for determining status bar style
    • According to Apple's documentation,

      "If your container view controller derives its status bar style from one of its child view controllers, [override this property] and return that child view controller. If you return nil or do not override this method, the status bar style for self is used. If the return value from this method changes, call the setNeedsStatusBarAppearanceUpdate() method."

    • In other words, if you don't implement solution 3 here, the system will fall back to solution 2 above.
    • Subclass or extend UINavigationController

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

      extension UINavigationController {open override var childForStatusBarStyle: UIViewController? {topViewController}}
    • You can return any view controller you'd like above. I recommend one of the following:

      • topViewController (of UINavigationController) (doc) - The view controller at the top of the navigation stack
      • visibleViewController (of UINavigationController) (doc) - The view controller associated with the currently visible view in the navigation interface (hint: this can include "a view controller that was presented modally on top of the navigation controller itself")

Note: If you decide to subclass UINavigationController, remember to apply that class to your nav controllers through the identity inspector in IB.

P.S. This works on iOS 13 😎

在我的Swift 5中,我添加了这些行:

override func viewDidAppear(_ animated: Bool) {navigationController?.navigationBar.barStyle = .black}
override var preferredStatusBarStyle: UIStatusBarStyle {return .lightContent}
extension UIApplication {
var statusBarView: UIView? {return value(forKey: "statusBar") as? UIView}}

这里有一个更好的解决方案扩展导航控制器并放入故事板

class NVC: UINavigationController {
override var preferredStatusBarStyle: UIStatusBarStyle {return .lightContent}
override func viewDidLoad() {super.viewDidLoad()
self.navigationBar.isHidden = trueself.navigationController?.navigationBar.isTranslucent = false      
self.navigationBar.barTintColor = UIColor.whitesetStatusBarColor(view : self.view)}    

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

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

此解决方案适用于使用新的SwiftUI生命周期/iOS14.0的应用程序:

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

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

StatusBarController.swift文件复制到您的项目中并将主视图包装成RootView

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

然后,您可以使用.statusBarStyle(.darkContent).statusBarStyle(.lightContent)视图修饰符或直接调用例如UIApplication.setStatusBarStyle(.lightContent)来更改状态栏文本颜色。

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

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

截至2021年-Swift 5,Xcode 12

将状态栏更改为白色:

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

在我的情况下没有任何帮助。我试图在ViewController2处更改StatusBar颜色,这是嵌入在NavigationController中的,反过来,从ViewController1以模态方式呈现。这种方式不起作用:

override var preferredStatusBarStyle: UIStatusBarStyle {return .darkContent}

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

navigationController.modalPresentationCapturesStatusBr=应用场景true

let navigationController = UINavigationController(rootViewController: viewController2)navigationController.modalPresentationStyle = .overFullScreennavigationController.modalTransitionStyle = .crossDissolvenavigationController.modalPresentationCapturesStatusBarAppearance = trueself.present(navigationController, animated: true)

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

文档:

此属性的默认值为false。

当您通过调用视图控制器来呈现视图控制器时呈现(_:动画:完成:)方法,状态栏外观控制从呈现传送到呈现视图控制器仅当呈现控制器的modalPresentationStyle值为UIModalPresentationStyle.fullScreen。通过将此属性设置为true,您指定呈现的视图控制器控件状态栏外观,即使呈现非全屏。

系统忽略视图控制器的此属性值全屏显示

这个答案是在hackingwisswft网站的帮助下得到的

iOS(13,*)

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

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

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

更多详细信息请访问hackingwisswft