1057

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

4

59 回答 59

1445
  1. 在 .plist 文件中设置为UIViewControllerBasedStatusBarAppearanceYES

  2. viewDidLoad做一个[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 创建一个新的 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())
于 2013-07-21T03:36:11.823 回答
858

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

  1. 在你View controller-based status bar appearance的.NOInfo.plist
  2. 称呼[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

注意:此方法在 iOS9 中已被弃用。改为在 UIViewController 上使用preferredStatusBarStyle。(请参阅Apple 开发人员库

于 2013-08-12T10:35:06.673 回答
451

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

在您的项目 plist文件中:

  • 状态栏样式:Transparent black style (alpha of 0.5)
  • 查看基于控制器的状态栏外观:NO
  • 状态栏最初是隐藏的:NO
于 2013-09-11T04:47:02.713 回答
247

Note: The most upvoted answer does not work for iOS 7 / 8

In Info.plist set 'View controller-based status bar appearance' as NO

In AppDelegate add

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

to

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

This solution works for iOS 7 / 8.

于 2013-09-23T05:11:30.577 回答
120

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

在此处输入图像描述

于 2013-09-12T16:42:35.840 回答
103

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

Info.plist中,添加一行:

UIViewControllerBasedStatusBarAppearance,并设置值NO

然后在 AppDelegate 中didFinishLaunchingWithOptions,添加这些行:

[application setStatusBarHidden:NO];
[application setStatusBarStyle:UIStatusBarStyleLightContent];
于 2013-12-29T11:28:29.170 回答
77

你不需要为此做任何代码

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

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

在此处输入图像描述

而已。

于 2016-02-09T09:00:59.500 回答
52

只需以下两步:

步骤1:

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

UIViewControllerBasedStatusBarAppearance, 设定值NO

第2步:

在项目中AppDelegate.m

- (BOOL)application:(UIApplication *)application 
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    …
    [application setStatusBarStyle:UIStatusBarStyleLightContent];
    …
}
于 2013-12-21T13:55:54.533 回答
48

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

  1. 设置the UIViewControllerBasedStatusBarAppearance为. NO_ Info.plist

  2. ViewDidLoad方法或任何地方,您想在哪里更改状态栏样式: [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

于 2013-09-13T08:28:17.890 回答
34

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

-[UINavigationBar setBarStyle:UIBarStyleBlack]

原始答案在这里

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

于 2013-09-27T08:16:46.093 回答
32

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

-(UIStatusBarStyle)preferredStatusBarStyle{ 
    return UIStatusBarStyleLightContent; 
} 

这应该就是你所需要的。

于 2013-08-19T00:41:31.160 回答
29

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

这是我所做的,它有效:

信息列表:

在此处输入图像描述

于 2014-08-20T22:34:52.300 回答
26
  1. 转到Project-> Target,

  2. 然后设置Status Bar StyleLight。它使启动屏幕上的状态栏变为白色。 项目设置

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

于 2016-05-31T01:46:28.763 回答
23

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

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

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

} 

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

于 2014-09-06T04:09:45.000 回答
23

更改信息 PLIST 在 Swift 3 中非常简单,只需 2 个步骤。转到您的 info.plist 并将密钥更改View controller-based status bar appearance为“否”。然后在 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
 }
于 2017-03-27T22:23:30.860 回答
22

Simply In App Delegate:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

In Swift 5, Follow the below steps:

  1. Add key UIViewControllerBasedStatusBarAppearance and set value to false in Info.plist
  2. Add key UIStatusBarStyle and set value to UIStatusBarStyleLightContent
于 2014-01-16T17:34:03.970 回答
21

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

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

答对了。它对我有用。

于 2014-01-10T12:40:41.537 回答
19

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

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

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

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

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

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

打开 Project Navigator 并为您的 iOS 应用程序选择项目,然后选择 Info 选项卡。

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

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

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

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

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

于 2013-12-10T13:47:43.523 回答
14

为 Xcode GM Seed 更新的答案:

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

  2. 在项目中,设置:

    在此处输入图像描述

  3. 在 ViewDidLoad 中:

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

于 2013-09-16T06:43:41.207 回答
13

不需要做一些额外的事情,只需在你的 viewController 中编写这段代码并获得状态栏颜色为白色

- (UIStatusBarStyle)preferredStatusBarStyle{return UIStatusBarStyleLightContent;}
于 2013-09-27T08:49:26.533 回答
12

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

截至 2021 年 - Swift 5、Xcode 12

要将状态栏更改为白色:

  1. 打开你的Info.plist
  2. 添加键UIViewControllerBasedStatusBarAppearance并将值设置为No(false)。人类可读的版本是"View controller-based status bar appearance".
  3. 将键UIStatusBarStyle和设置值添加到UIStatusBarStyleLightContent(即,"Light Content")。
于 2021-04-02T18:43:17.923 回答
12

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

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

如果你想设置状态栏样式,应用程序级别然后UIViewControllerBasedStatusBarAppearanceNO你的`.plist'文件中设置。

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

  1. 如果您只需要在 UIViewController 级别设置状态栏样式,请在文件中设置UIViewControllerBasedStatusBarAppearanceto 。YES.plist
  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
    }

}



这是结果:

在此处输入图像描述

于 2017-10-17T08:33:34.550 回答
12

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

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

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

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

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

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

在此处输入图像描述

或者在代码中执行如下

navigationController?.navigationBar.barStyle = UIBarStyle.Black

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

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

在代码中设置状态栏样式

于 2015-09-17T13:18:51.537 回答
11

这在iOS 7 UI 转换指南中有记录,您需要一个 Apple 开发者 ID 才能直接访问。相关摘录:

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

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

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

也可能感兴趣:

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

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

于 2013-07-16T14:24:01.280 回答
11

只需调用

[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];

在里面

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

我的工作方法AppDelegate在 iOS7 中对我来说很棒。

于 2013-11-10T20:07:28.767 回答
10

对于 Swift 5,我添加了以下几行:

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

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}
于 2020-03-01T12:40:16.447 回答
9

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

于 2015-03-30T05:06:22.050 回答
9

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

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

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

我希望它有所帮助。

编辑

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

于 2013-09-22T13:54:45.500 回答
9

如果你想用 Swift 得到同样的结果,你可以在你的 AppDelegate.swift 文件中使用这个代码:

UINavigationBar.appearance().barStyle = .BlackTranslucent

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

于 2016-01-10T19:30:06.957 回答
8

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

[[[self navigationController] navigationBar] setBarStyle:UIBarStyleBlackTranslucent];
于 2015-02-05T12:28:35.257 回答
8

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

View controller-based status bar appearanceNO

Status bar styleOpaque black style

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

UIViewControllerBasedStatusBarAppearanceNO

UIStatusBarStyleOpaque black style

于 2014-10-08T14:17:14.573 回答
7

在 Plist 中,添加以下内容:

  • 状态栏样式:UIStatusBarStyleLightContent
  • 查看基于控制器的状态栏外观:NO
于 2014-07-19T06:36:09.837 回答
7

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

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

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

ios 7 状态栏文字颜色

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

     [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

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

于 2015-06-30T17:38:28.790 回答
6

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

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

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

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

@interface MyNavigationController : UINavigationController

@end

@implementation MyNavigationController

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

@end
于 2013-10-16T18:21:41.987 回答
5

对于Xcode 5.1:

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

在 AppDelegate 中,添加:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

就这样!

于 2014-09-02T01:57:08.893 回答
5

斯威夫特 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
于 2016-12-19T12:31:23.650 回答
4

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

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

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

完毕

于 2013-11-13T17:23:17.430 回答
4

iOS 13 解决方案

UINavigationControllerUIViewController(谁知道)的子类!

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

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

  1. 完全退出黑暗模式
    • 在您的info.plist中,添加以下属性:
      • 键 - UIUserInterfaceStyle(又名“用户界面风格”)
      • 价值 - 光
  2. 覆盖preferredStatusBarStyle范围内UINavigationController

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

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

      或者

      extension UINavigationController {
          open override var preferredStatusBarStyle: UIStatusBarStyle {
              .lightContent
          }
      }
      
  3. 覆盖childForStatusBarStyle范围内UINavigationController

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

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

    • 换句话说,如果您在此处不执行解决方案 3,系统将回退到上面的解决方案 2。
    • 子类或扩展UINavigationController

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

      或者

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

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

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

PS这适用于iOS 13

于 2019-10-23T03:21:11.627 回答
4

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

在 AppDelegate 添加

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
于 2015-11-18T07:29:58.457 回答
4

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

迅速 3

如果在 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  
于 2017-06-21T05:40:16.590 回答
3

如果我使用 UINavigationController,我会在 iOS 9 和 Swift 2.0 中进行此操作

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

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

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return .LightContent
}
于 2015-10-16T13:38:54.423 回答
3

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

  • 在 plist 中设置UIViewControllerBasedStatusBarAppearanceNO
  • 设置UIStatusBarStyleUIStatusBarStyleLightContent

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

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

-(void)viewWillDisappear:(BOOL)animated  
{  
  [super viewWillAppear:animated];  
  [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}    
于 2015-12-09T15:19:19.850 回答
3

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

于 2015-10-08T11:42:53.627 回答
3

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

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

您将拥有White状态栏。

于 2016-06-22T17:43:49.790 回答
2

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

苹果开发者论坛的一些相关内容在苹果开发者论坛的“iOS 7 Beta Livability”中搜索UIStatusBarStyleLightContent *(目前有32个帖子)。

我遇到它试图将其设置为轻型版本。

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

于 2013-07-17T15:42:31.750 回答
2

这对我有用:

  1. UIViewControllerBasedStatusBarAppearance_ YES_plist

  2. 需要rootViewController方法实现

    -(UIStatusBarStyle)preferredStatusBarStyle
    

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

#import "JASidePanelController+StatusBarStyle.h"

@implementation JASidePanelController (StatusBarStyle)

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

@end
于 2014-01-28T13:25:39.720 回答
2
  • 删除.plist 文件中基于视图控制器的状态栏外观(如果你有创建)并重新创建它。

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

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

 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
于 2013-10-29T09:35:30.907 回答
2

就我而言,没有任何帮助。我试图改变嵌入在 中的StatusBar颜色,而后者又是从 模态呈现的。这种方式行不通:ViewController2NavigationControllerViewController1

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .darkContent
}

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

navigationController.modalPresentationCapturesStatusBarAppearance = true

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

因此,如果您有类似的导航方案ViewController1 presented ViewController2,请尝试modalPresentationCapturesStatusBarAppearance所提供的导航方案的属性

文档:

此属性的默认值为 false。

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

对于全屏显示的视图控制器,系统会忽略此属性的值。

于 2021-09-16T15:14:41.923 回答
2

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

  [[UIApplication
 sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent]; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
于 2016-04-27T13:37:38.763 回答
1

在 iOS 7 上,如果你想使用 UIViewControllerBasedStatusBarAppearance == YES,并且你的根视图控制器是 UINavigationController,你应该继承它并重载 childViewControllerForStatusBarStyle,例如,像这样:

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

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

于 2013-11-19T14:18:25.273 回答
1

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

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

[[UIApplication sharedApplication] setStatusBarStyle:STATUS_STYLE animated:YES];
于 2013-11-27T07:46:19.443 回答
1

这个答案是在 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

于 2021-12-03T15:55:42.590 回答
1

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

extension UINavigationController {
    override open var preferredStatusBarStyle: UIStatusBarStyle {
       return .lightContent
    }   
}
于 2016-10-13T09:32:46.310 回答
1

请试试这个

[[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];
    }
于 2017-10-06T19:30:16.860 回答
0

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

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
             }
         }
}

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

于 2020-12-19T06:58:02.400 回答
0

此解决方案适用于使用新的 SwiftUI Lifecycle / iOS 14.0的应用程序:

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

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

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

@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 
            }
        }
    }
}

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

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

于 2021-03-23T03:14:17.430 回答
0

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

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 的评论部分,并告知您正在使用此代码更改状态栏颜色。

的,也不要忘记下面。

于 2015-10-06T08:23:56.633 回答
-2
extension UIApplication {

    var statusBarView: UIView? {
        return value(forKey: "statusBar") as? UIView
    }
}
于 2020-03-17T05:50:58.180 回答
-3

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

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

self.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName :
                                                                        [UIColor whiteColor],
                                               NSFontAttributeName:[UIFont boldSystemFontOfSize:19]};
于 2017-03-08T07:51:31.707 回答