我的应用程序有深色背景,但在 iOS 7 中,状态栏变得透明。所以我在那里什么都看不到,只有角落里的绿色电池指示灯。如何将状态栏文本颜色更改为白色,就像在主屏幕上一样?
59 回答
在 .plist 文件中设置为
UIViewControllerBasedStatusBarAppearance
。YES
在
viewDidLoad
做一个[self setNeedsStatusBarAppearanceUpdate];
添加以下方法:
- (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())
或者,您可以选择退出基于视图控制器的状态栏外观:
- 在你
View controller-based status bar appearance
的.NO
Info.plist
- 称呼
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
注意:此方法在 iOS9 中已被弃用。改为在 UIViewController 上使用preferredStatusBarStyle
。(请参阅Apple 开发人员库)
您无需编写任何代码即可做到这一点!
执行以下操作以使整个应用程序的状态栏文本颜色为白色
在您的项目 plist文件中:
- 状态栏样式:
Transparent black style (alpha of 0.5)
- 查看基于控制器的状态栏外观:
NO
- 状态栏最初是隐藏的:
NO
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.
对我来说,使用其他答案(以及其他来源/文档)中的所有东西都没有发生任何事情。有帮助的是在 XIB 中将导航栏样式设置为“黑色”。这将文本更改为白色,根本没有任何代码。
这些都不适合我,所以这是一个可行的解决方案......
在Info.plist
中,添加一行:
UIViewControllerBasedStatusBarAppearance
,并设置值NO
。
然后在 AppDelegate 中didFinishLaunchingWithOptions
,添加这些行:
[application setStatusBarHidden:NO];
[application setStatusBarStyle:UIStatusBarStyleLightContent];
只需以下两步:
步骤1:
在的信息选项卡下project target
,添加行:
UIViewControllerBasedStatusBarAppearance
, 设定值NO
。
第2步:
在项目中AppDelegate.m
:
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
…
[application setStatusBarStyle:UIStatusBarStyleLightContent];
…
}
这适用于 2013 年 9 月 18 日发布的 Golden Master iOS 7 和 Xcode 5 GM 种子和 iOS7 SDK(至少隐藏导航控制器):
设置
the UIViewControllerBasedStatusBarAppearance
为.NO
_Info.plist
在
ViewDidLoad
方法或任何地方,您想在哪里更改状态栏样式:[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
如果您的 UIViewController 在 UINavigationController 中,您将必须设置 BarStyle:
-[UINavigationBar setBarStyle:UIBarStyleBlack]
原始答案在这里
如果您有通过Interface Builder创建的嵌入式导航控制器,请务必在管理导航控制器的类中设置以下内容:
-(UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}
这应该就是你所需要的。
在 AppDelegate.m 中,添加以下内容。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}
并在 Plist 文件中,将“基于控制器的状态栏外观”设置为 NO。
在 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
}
Simply In App Delegate:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
In Swift 5, Follow the below steps:
- Add key
UIViewControllerBasedStatusBarAppearance
and set value tofalse
in Info.plist - Add key
UIStatusBarStyle
and set value toUIStatusBarStyleLightContent
嗯,这对我来说真的很像小菜一碟。
转到您应用的info.plist
.
- 设置
View controller-based status bar appearance
为NO
- 设置
Status bar style
为UIStatusBarStyleLightContent
然后转到您的应用程序的委托并粘贴以下代码,您可以在其中设置 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];
}
答对了。它对我有用。
iOS 7 允许各个视图控制器确定状态栏的外观,如 Apple 开发人员文档所述:
iOS 7 让视图控制器能够在应用程序运行时调整状态栏的样式。动态更改状态栏样式的一个好方法是
preferredStatusBarStyle
在动画块中实现并更新状态栏外观并调用setNeedsStatusBarAppearanceUpdate
.
全局设置状态栏外观是一个两步过程。
首先,您需要告诉 iOS 您不想在逐个视图的基础上设置状态栏外观。
然后你需要负责并实际设置新的全局状态栏样式。
要禁用逐视图状态栏控制,您需要View controller-based status bar appearance
在Info.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/
为 Xcode GM Seed 更新的答案:
输入为
Info.plist
_View controller-based status bar appearance
NO
在项目中,设置:
在 ViewDidLoad 中:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
不需要做一些额外的事情,只需在你的 viewController 中编写这段代码并获得状态栏颜色为白色
- (UIStatusBarStyle)preferredStatusBarStyle{return UIStatusBarStyleLightContent;}
Xcode 似乎不断地改变这一点,所以这是最新的。
截至 2021 年 - Swift 5、Xcode 12
要将状态栏更改为白色:
- 打开你的Info.plist。
- 添加键
UIViewControllerBasedStatusBarAppearance
并将值设置为No
(false)。人类可读的版本是"View controller-based status bar appearance"
. - 将键
UIStatusBarStyle
和设置值添加到UIStatusBarStyleLightContent
(即,"Light Content"
)。
这是关于状态栏更改的Apple 指南/说明。状态栏中只允许使用深色和浅色(白色和黑色)。
这是 - 如何更改状态栏样式:
如果你想设置状态栏样式,应用程序级别然后UIViewControllerBasedStatusBarAppearance
在NO
你的`.plist'文件中设置。
如果您想在视图控制器级别设置状态栏样式,请按照以下步骤操作:
- 如果您只需要在 UIViewController 级别设置状态栏样式,请在文件中设置
UIViewControllerBasedStatusBarAppearance
to 。YES
.plist
在 viewDidLoad 添加函数 -
setNeedsStatusBarAppearanceUpdate
覆盖视图控制器中的 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
}
}
这是结果:
我认为所有答案都没有真正指出问题所在,因为它们都适用于特定场景。但是,如果您需要涵盖所有情况,请遵循以下几点:
根据您需要状态栏灯样式的位置,您应该始终牢记以下 3 点:
1)如果您在启动屏幕或其他地方需要状态栏,您无法控制它(不是在视图控制器中,而是在一些系统控制的元素/时刻,如启动屏幕) 你去你的项目设置
2)如果您在导航控制器中有一个控制器 您可以在界面构建器中更改它,如下所示:
b)然后将导航栏的样式设置为“黑色”,因为这意味着您的状态栏下方将有一个“黑色”->深色背景,因此会将状态栏设置为白色
或者在代码中执行如下
navigationController?.navigationBar.barStyle = UIBarStyle.Black
3)如果你有单独的控制器需要有它自己的状态栏样式,并且它没有作为 UINavigationController 嵌入到某些容器结构中
在代码中为控制器设置状态栏样式:
这在iOS 7 UI 转换指南中有记录,您需要一个 Apple 开发者 ID 才能直接访问。相关摘录:
因为状态栏是透明的,所以它后面的视图就透出来了。[...] 使用
UIStatusBarStyle
常量来指定状态栏内容应该是深色还是浅色:
UIStatusBarStyleDefault
显示深色内容。[...]
UIStatusBarStyleLightContent
显示轻量级内容。当深色内容位于状态栏后面时使用。
也可能感兴趣:
在 iOS 7 中,您可以从单个 vew 控制器控制状态栏的样式,并在应用程序运行时更改它。要选择加入此行为,请将
UIViewControllerBasedStatusBarAppearance
key 添加到应用程序的Info.plist
文件中并为其指定 valueYES
。
我绝对建议您查看文档,再次,您可以使用您的 Apple 开发人员 ID 访问该文档。
只需调用
[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];
在里面
-(BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
}
我的工作方法AppDelegate
在 iOS7 中对我来说很棒。
对于 Swift 5,我添加了以下几行:
override func viewDidAppear(_ animated: Bool) {
navigationController?.navigationBar.barStyle = .black
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
在 info.plist 中设置字段值 NO查看基于控制器的状态栏外观并在目标 > 常规设置中设置状态栏样式灯。
我做了一些不同的事情,它对我有用。
在没有更改代码的情况下,我确实像这样配置了我的 .plist 文件:
- 查看基于控制器的状态栏外观 > 否
- 状态栏样式 > UIStatusBarStyleLightContent(简单字符串)
我希望它有所帮助。
编辑
对于每个视图控制器,我将情节提要中的“状态栏”的模拟指标属性从“推断”更改为“轻量内容”
如果你想用 Swift 得到同样的结果,你可以在你的 AppDelegate.swift 文件中使用这个代码:
UINavigationBar.appearance().barStyle = .BlackTranslucent
并且您的状态栏的文本将是白色的 :-) !
如果您仍然想View controller-based status bar appearance
在 info.plist 中使用设置为 YES,这意味着您可以更改每个视图控制器的状态栏,请在 ViewDidLoad 中的状态栏中使用以下白色文本:
[[[self navigationController] navigationBar] setBarStyle:UIBarStyleBlackTranslucent];
总结一下,编辑您的项目Info.plist
并添加:
View controller-based status bar appearance
:NO
Status bar style
:Opaque black style
或者如果您有原始键/值 plist
UIViewControllerBasedStatusBarAppearance
:NO
UIStatusBarStyle
:Opaque black style
在 Plist 中,添加以下内容:
- 状态栏样式:
UIStatusBarStyleLightContent
- 查看基于控制器的状态栏外观:
NO
让我给你一个完整的答案。更改状态栏文本颜色非常容易,但在 iOS 7 中它有点令人困惑,特别是对于新手。
如果您尝试通过选择视图控制器并转到右侧的模拟度量来将 Storyboard 中的颜色从黑色更改为白色,它将不起作用,我不知道为什么。它应该通过这样的改变来工作,但无论如何。
其次,您不会在 plist 中找到 UIViewControllerBasedStatusBarAppearance 属性,但默认情况下它不存在。您必须通过单击 + 按钮自行添加,然后将其设置为 NO。
ios 7 状态栏文字颜色
最后,您必须转到 AppDelegate.m 文件并在 didFinishLaunchingWithOptions 方法中添加以下内容,添加以下行:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
这会将所有视图控制器的颜色更改为白色。希望这可以帮助!
完成这项工作的关键是只有全屏视图控制器才能决定状态栏的样式。
如果您使用导航控制器并希望在每个视图控制器的基础上控制状态栏,您需要继承 UINavigationController 并实现 preferredStatusBarStyle 以便它返回 topViewController 的首选项。
确保将情节提要场景中的类引用从 UINavigationController 更改为子类(例如下面示例中的 MyNavigationController)。
(以下对我有用。如果您的应用程序是基于 TabBar 的,您将希望通过子类化 UITabBarController 来做类似的事情,但我还没有尝试过)。
@interface MyNavigationController : UINavigationController
@end
@implementation MyNavigationController
- (UIStatusBarStyle)preferredStatusBarStyle
{
return self.topViewController.preferredStatusBarStyle;
}
@end
对于Xcode 5.1:
在 .plist 中将“基于视图控制器的状态栏外观”添加到NO。
在 AppDelegate 中,添加:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
就这样!
斯威夫特 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
您可以从 info.plist 执行此操作:
1)“查看基于控制器的状态栏外观”设置为“否”
2)“状态栏样式”设置为“UIStatusBarStyleLightContent”
完毕
iOS 13 解决方案
UINavigationController
是UIViewController
(谁知道)的子类!
因此,当呈现嵌入在导航控制器中的视图控制器时,您并没有真正呈现嵌入的视图控制器。您正在展示导航控制器!UINavigationController
, 作为 , 的子类UIViewController
, 继承preferredStatusBarStyle
和childForStatusBarStyle
, 您可以根据需要进行设置。
以下任何一种方法都应该有效:
- 完全退出黑暗模式
- 在您的
info.plist
中,添加以下属性:- 键 -
UIUserInterfaceStyle
(又名“用户界面风格”) - 价值 - 光
- 键 -
- 在您的
覆盖
preferredStatusBarStyle
范围内UINavigationController
preferredStatusBarStyle
( doc ) - 视图控制器的首选状态栏样式子类或扩展
UINavigationController
class MyNavigationController: UINavigationController { override var preferredStatusBarStyle: UIStatusBarStyle { .lightContent } }
或者
extension UINavigationController { open override var preferredStatusBarStyle: UIStatusBarStyle { .lightContent } }
覆盖
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 } }
您可以在上面返回您想要的任何视图控制器。我推荐以下之一:
注意:如果您决定子类UINavigationController
化,请记住通过 IB 中的身份检查器将该类应用于您的导航控制器。
PS这适用于iOS 13
在 Info.plist 中将“查看基于控制器的状态栏外观”设置为 NO
在 AppDelegate 添加
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
更改所有 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
如果我使用 UINavigationController,我会在 iOS 9 和 Swift 2.0 中进行此操作
self.navigationController?.navigationBar.barStyle = UIBarStyle.Black
如果我使用模态转场,我会这样做
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}
如果您的应用程序需要UIStatusBarStyleLightContent
默认设置,但您仍希望能够UIStatusBarStyleDefault
在某些屏幕上使用,您可以选择在控制器级别管理状态栏颜色,但在这种情况下,您必须preferredStatusBarStyle
在每个视图中覆盖控制器(或在基本视图控制器中实现它,所有其他视图控制器都将从该控制器继承)。这是解决此问题的另一种方法:
- 在 plist 中设置
UIViewControllerBasedStatusBarAppearance
为NO
- 设置
UIStatusBarStyle
为UIStatusBarStyleLightContent
所有视图控制器都将使用白色文本作为状态栏。现在仅在需要带有黑色文本的状态栏的视图控制器中添加此方法:
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
}
-(void)viewWillDisappear:(BOOL)animated
{
[super viewWillAppear:animated];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}
在 iOS 8 中:添加NavigationController.NavigationBar.BarStyle = UIBarStyle.Black;
到viewDidLoad
从 Xcode(无需任何编码)执行此操作的最简单方法是:
- 添加
View controller-based status bar appearance
到您的 Info.plist 并将值设置为NO
. - 现在,转到您的项目目标,在里面
Deployment Info
您会找到Status Bar Style
. 将此选项的值设置为Light
。
您将拥有White
状态栏。
这似乎是当前 Xcode 和 iOS 7 版本的问题。
苹果开发者论坛的一些相关内容在苹果开发者论坛的“iOS 7 Beta Livability”中搜索UIStatusBarStyleLightContent *(目前有32个帖子)。
我遇到它试图将其设置为轻型版本。
(这只是对亚伦回答的跟进。)
这对我有用:
在
UIViewControllerBasedStatusBarAppearance
_YES
_plist
需要
rootViewController
方法实现-(UIStatusBarStyle)preferredStatusBarStyle
因为 myrootViewController
是由 Cocoapods ( JASidePanelController
) 管理的,所以我通过一个类别添加了这个方法:
#import "JASidePanelController+StatusBarStyle.h"
@implementation JASidePanelController (StatusBarStyle)
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
@end
删除.plist 文件中基于视图控制器的状态栏外观(如果你有创建)并重新创建它。
将状态栏样式设置为不透明黑色样式
在 appDelegate 中,在 didFinishLaunching 下添加以下代码。
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
就我而言,没有任何帮助。我试图改变嵌入在 中的StatusBar
颜色,而后者又是从 模态呈现的。这种方式行不通:ViewController2
NavigationController
ViewController1
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,您可以指定呈现的视图控制器控件状态栏的外观,即使呈现非全屏。
对于全屏显示的视图控制器,系统会忽略此属性的值。
只需更改1) Info.plist
查看基于控制器的状态栏appearance
->NO
并编写
2)
[[UIApplication
sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
在
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
在 iOS 7 上,如果你想使用 UIViewControllerBasedStatusBarAppearance == YES,并且你的根视图控制器是 UINavigationController,你应该继承它并重载 childViewControllerForStatusBarStyle,例如,像这样:
- (UIViewController*) childViewControllerForStatusBarStyle
{
return self.viewControllers.lastObject;
}
在此之后,preferredStatusBarStyle 将在推送的视图控制器上被调用。
您可以将其用于 iOS 6 和 7:
#ifdef __IPHONE_7_0
# define STATUS_STYLE UIStatusBarStyleLightContent
#else
# define STATUS_STYLE UIStatusBarStyleBlackTranslucent
#endif
[[UIApplication sharedApplication] setStatusBarStyle:STATUS_STYLE animated:YES];
这个答案是在 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
我必须为 swift 和导航控制器做什么
extension UINavigationController {
override open var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
请试试这个
[[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];
}
这是一个更好的解决方案扩展导航控制器并放入情节提要
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
}
}
}
状态栏颜色为黑色,文本为白色
此解决方案适用于使用新的 SwiftUI Lifecycle / iOS 14.0的应用程序:
我需要动态更改状态栏文本颜色并且无法访问window.rootViewController
,因为SceneDelegate
SwiftUI 生命周期不存在。
我终于通过 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”。
如果要将其设置为任何颜色,请使用以下代码。
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 的评论部分,并告知您正在使用此代码更改状态栏颜色。
是的,也不要忘记下面。
extension UIApplication {
var statusBarView: UIView? {
return value(forKey: "statusBar") as? UIView
}
}
非常简单的方法来改变状态栏的颜色。创建导航控制器的子类。
在视图 didload 方法中编写此代码。在所有视图控制器中影响此代码
self.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName :
[UIColor whiteColor],
NSFontAttributeName:[UIFont boldSystemFontOfSize:19]};