提问人:Oleksandr Veremchuk 提问时间:7/16/2013 最后编辑:Navneet KaurOleksandr Veremchuk 更新时间:6/8/2023 访问量:669176
如何在iOS中更改状态栏文本颜色
How to change Status Bar text color in iOS
问:
我的应用程序背景为深色,但在 iOS 7 中,状态栏变为透明。所以我在那里什么也看不见,只有角落里的绿色电池指示灯。如何将状态栏文本颜色更改为白色,就像在主屏幕上一样?
答:
这记录在 iOS 7 UI 过渡指南中,您需要 Apple 开发人员 ID 才能直接访问该指南。相关摘录:
由于状态栏是透明的,因此会显示其后面的视图。[...]使用常量指定状态栏内容应为深色还是浅色:
UIStatusBarStyle
UIStatusBarStyleDefault
显示深色内容。[...]
UIStatusBarStyleLightContent
显示灯光内容。当深色内容位于状态栏后面时使用。
可能还感兴趣:
在 iOS 7 中,您可以从单个 vew 控制器控制状态栏的样式,并在应用程序运行时对其进行更改。若要选择加入此行为,请将密钥添加到应用的文件,并为其指定值。
UIViewControllerBasedStatusBarAppearance
Info.plist
YES
我绝对建议您浏览一下该文档,同样,您可以使用您的 Apple 开发人员 ID 访问该文档。
评论
这似乎是当前 Xcode 和 iOS 7 版本的问题。
Apple 开发者论坛上的一些相关内容可在 Apple 开发者论坛*(目前有 32 篇文章)的“iOS 7 Beta 宜居性”中搜索 UIStatusBarStyleLightContent。
我遇到了它,试图将其设置为轻量级版本。
(这只是 Aaron 回答的后续。
在 .plist 文件中设置 to。
UIViewControllerBasedStatusBarAppearance
YES
在 do a
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,创建一个名为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。(请参阅 Apple Developer LibrarypreferredStatusBarStyle
)
评论
如果您通过 Interface Builder 创建了嵌入式导航控制器,请确保在管理导航控制器的类中设置以下内容:
-(UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}
这应该是你所需要的。
评论
您无需编写任何代码即可做到这一点!
执行以下操作,使状态栏文本在整个应用程序中显示为白色
在项目 plist 文件上:
- 状态栏样式:
Transparent black style (alpha of 0.5)
- 查看基于控制器的状态栏外观:
NO
- 状态栏最初是隐藏的:
NO
评论
UIStatusBarStyleLightContent
plist info
Transparent Black
View controller-based status bar appearance
<key>UIStatusBarStyle</key> <string>UIStatusBarStyleLightContent</string> <key>UIViewControllerBasedStatusBarAppearance</key> <false/>
对我来说,使用其他答案(以及其他来源/文档)中的所有内容都没有发生任何事情。有帮助的是将 XIB 中的导航栏样式设置为“黑色”。这会将文本更改为白色,而没有任何代码。
评论
这适用于 2013 年 9 月 18 日发布的 Golden Master iOS 7 和 Xcode 5 GM seed 和 iOS7 SDK(至少在隐藏导航控制器的情况下):
在 中设置为 。
the UIViewControllerBasedStatusBarAppearance
NO
Info.plist
在方法或任何地方,您要更改的位置 状态栏样式:
ViewDidLoad
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
评论
答案已更新为 Xcode GM Seed:
输入为
Info.plist
View controller-based status bar appearance
NO
在项目中,设置:
在 ViewDidLoad 中:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
评论
我做了一些不同的事情,这对我有用。
在代码没有更改的情况下,我确实像这样配置了我的 .plist 文件:
- 查看基于控制器的状态栏外观>否
- 状态栏样式 > UIStatusBarStyleLightContent (简单字符串)
我希望它有所帮助。
编辑
对于每个视图控制器,我在情节提要中将“状态栏”的“模拟指标”属性从“推断”更改为“轻量级内容”
注意:最多赞成的答案不适用于iOS 7 / 8
在 Info.plist 中,将“查看基于控制器的状态栏外观”设置为“否”
在 AppDelegate 中,添加
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
自
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
...
}
此解决方案适用于iOS 7 / 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 文件中基于视图控制器的状态栏外观(如果已创建),然后重新创建。
将状态栏样式设置为不透明的黑色样式
在 appDelegate 中,在 didFinishLaunching 下添加以下代码。
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
只需调用
[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];
在
-(BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
}
我在 iOS7 中对我有用的方法。AppDelegate
评论
View controller-based status bar appearance = NO
您可以从 info.plist 执行此操作:
1) “查看基于控制器的状态栏外观”设置为“否”
2)“状态栏样式”设置为“UIStatusBarStyleLightContent”
做
在 iOS 7 上,如果要使用 UIViewControllerBasedStatusBarAppearance == YES,并且根视图控制器是 UINavigationController,则应 子类化 it 并重载 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];
iOS 7 允许单个视图控制器确定状态栏的外观,如 Apple 开发人员文档中所述:
iOS 7 使视图控制器能够在应用运行时调整状态栏的样式。动态更改状态栏样式的一个好方法是在动画块中实现并更新状态栏外观并调用 。
preferredStatusBarStyle
setNeedsStatusBarAppearanceUpdate
全局设置状态栏外观的过程分为两步。
首先,您需要告诉 iOS 您不想逐个视图设置状态栏外观。
然后,您需要负责并实际设置新的全局状态栏样式。
要禁用逐视图状态栏控件,您需要在 中设置该属性。View controller-based status bar appearance
Info.plist
打开“项目导航器”,选择 iOS 应用的项目,然后选择“信息”选项卡。
将鼠标悬停在某一行上,然后单击出现的加号以向 ..plist
输入“键”字段,然后确保“类型”字段设置为 。最后,输入“值”字段。View controller-based status bar appearance
Boolean
NO
若要设置状态栏的全局样式,请在“信息”选项卡下添加另一个属性,其键为 、类型和值为 。Status bar style
String
Opaque black style
下面是一篇博客文章,其中包含更多详细信息和一些示例代码:
http://codebleep.com/setting-the-status-bar-text-color-in-ios-7/
评论
只需两个步骤如下:
步骤1:
在 的“信息”选项卡下,添加行:project target
UIViewControllerBasedStatusBarAppearance
,设置值。NO
步骤2:
在项目中:AppDelegate.m
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
…
[application setStatusBarStyle:UIStatusBarStyleLightContent];
…
}
评论
这些都不适合我,所以这里有一个可行的解决方案......
在 中,添加一行:Info.plist
UIViewControllerBasedStatusBarAppearance
,并设置值 。NO
然后在 的 AppDelegate 中添加以下行:didFinishLaunchingWithOptions
[application setStatusBarHidden:NO];
[application setStatusBarStyle:UIStatusBarStyleLightContent];
评论
嗯,这对我来说真的是小菜一碟。
转到应用的 .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];
}
宾果游戏。它对我有用。
评论
只需在应用内委托:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
在 Swift 5 中,请按照以下步骤操作:
- 在 Info.plist 中添加键并设置值
UIViewControllerBasedStatusBarAppearance
false
- 添加键并将值设置为
UIStatusBarStyle
UIStatusBarStyleLightContent
评论
这对我有用:
将 to 在
UIViewControllerBasedStatusBarAppearance
YES
plist
需要方法实现
rootViewController
-(UIStatusBarStyle)preferredStatusBarStyle
因为我是由 Cocoapods () 管理的,所以我通过一个类别添加了这个方法:rootViewController
JASidePanelController
#import "JASidePanelController+StatusBarStyle.h"
@implementation JASidePanelController (StatusBarStyle)
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
@end
在 Plist 中,添加以下内容:
- 状态栏样式:
UIStatusBarStyleLightContent
- 查看基于控制器的状态栏外观:
NO
我正在 Swift 项目上使用 Xcode 6 beta 5,用于 iOS 7 应用程序。
这是我所做的,它有效:
信息.plist:
评论
对于 Xcode 5.1:
在 .plist 中将“查看基于控制器的状态栏外观”添加到 NO。
在 AppDelegate 中,添加:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
就这样!
在 AppDelegate.m 中,添加以下内容。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}
在 Plist 文件中,将“查看基于控制器的状态栏外观”设置为“否”。
总而言之,编辑您的项目并添加:Info.plist
View controller-based status bar appearance
:NO
Status bar style
:Opaque black style
或者,如果您有原始键/值 plist
UIViewControllerBasedStatusBarAppearance
:NO
UIStatusBarStyle
:Opaque black style
评论
preferredStatusBarStyle
如果您仍想在 info.plist 中使用,设置为 YES,这意味着您可以更改每个视图控制器的状态栏,请对 ViewDidLoad 状态栏中的白色文本使用以下命令:View controller-based status bar appearance
[[[self navigationController] navigationBar] setBarStyle:UIBarStyleBlackTranslucent];
评论
在 info.plist 中,将字段值设置为 NO 查看基于控制器的状态栏外观,并在“目标>常规”设置中设置状态栏样式灯。
评论
让我给你一个完整的答案。更改状态栏文本颜色非常容易,但在 iOS 7 中有点令人困惑,特别是对于新手。
如果您尝试通过选择视图控制器并转到右侧的模拟指标来将 Storyboard 中的颜色从黑色更改为白色,它将不起作用,我不知道为什么。它应该通过像这样改变来工作,但无论如何。
其次,你不会在 plist 中找到 UIViewControllerBasedStatusBarAppearance 属性,但默认情况下它不存在。您必须通过单击 + 按钮自行添加它,然后将其设置为 NO。
iOS 7 状态栏文本颜色
最后,您必须转到 AppDelegate.m 文件并在 didFinishLaunchingWithOptions 方法中添加以下内容,添加以下行:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
这会将所有视图控制器的颜色更改为白色。希望这有帮助!
评论
我认为所有的答案都没有真正指出问题所在,因为它们都在特定场景中起作用。但是,如果您需要涵盖所有情况,请遵循以下几点:
根据您需要状态栏指示灯样式的位置,您应该始终牢记以下 3 点:
1)如果您需要启动屏幕或其他无法控制它的位置的状态栏(不是在视图控制器中,而是在一些系统控制的元素/时刻,如启动屏幕)中,请转到项目设置
2) 如果导航控制器内部有控制器,则可以在界面构建器中更改它,如下所示:
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,并通知您正在使用此代码更改状态栏颜色。
是的,也不要忘记下面。
评论
在 iOS 8 中:
搭NavigationController.NavigationBar.BarStyle = UIBarStyle.Black;
viewDidLoad
如果我使用 UINavigationController,我会在 iOS 9 和 Swift 2.0 中做到这一点
self.navigationController?.navigationBar.barStyle = UIBarStyle.Black
如果我使用模态 segue,我会这样做
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}
在 Info.plist 中,将“查看基于控制器的状态栏外观”设置为“否”
在 AppDelegate 中,添加
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
如果应用程序默认需要,但你仍希望能够在某些屏幕上使用,则可以选择在控制器级别管理状态栏颜色,但在这种情况下,必须在每个视图控制器中覆盖它(或在基本视图控制器中实现它,所有其他视图控制器都将从该控制器继承)。这是解决此问题的另一种方法:UIStatusBarStyleLightContent
UIStatusBarStyleDefault
preferredStatusBarStyle
- 在 plist 中设置 to
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];
}
如果您希望使用 Swift 获得相同的结果,您可以在 AppDelegate.swift 文件中使用此代码:
UINavigationBar.appearance().barStyle = .BlackTranslucent
您的状态栏的文本将是白色的:-)!
您无需为此执行任何代码
您需要在 info.plist 中添加“查看基于控制器的状态栏外观”键,如下所示:
& 将其值类型设置为 Boolean,将值设置为 NO。 然后单击项目设置,然后单击“常规”选项卡,并在“部署信息”下将首选状态栏样式设置为。灯光如下:
就是这样。
评论
只需更改 1) 查看基于控制器的状态栏 -> 并写入 2)Info.plist
appearance
NO
[[UIApplication
sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
在
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
转到 -> ,
Project
Target
然后将 等于 设置为 。
View controller-based status bar appearance
NO
Info.plist
评论
View controller-based status bar appearance equal
NO
从 Xcode(无需任何编码)执行此操作的最简单方法是:
- 添加到 Info.plist 并将值设置为 .
View controller-based status bar appearance
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 appearance
价值NO
Status bar is initially hidden
价值YES
步骤2:在方法中写这个。didFinishLaunchingWithOptions
UIApplication.shared.isStatusBarHidden = false
UIApplication.shared.statusBarStyle = UIStatusBarStyle.lightContent
非常简单的方法:更改状态栏颜色。 创建导航控制器的子类。
在 view didload 方法中编写此代码。 在所有视图控制器中影响此代码
self.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName :
[UIColor whiteColor],
NSFontAttributeName:[UIFont boldSystemFontOfSize:19]};
评论
在 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
}
评论
更改所有 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
请试试这个
[[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”文件中将应用程序级别设置为。UIViewControllerBasedStatusBarAppearance
NO
如果要在视图控制器级别设置状态栏样式,请执行以下步骤:
- 如果只需要在 UIViewController 级别设置状态栏样式,请在文件中设置 to。
UIViewControllerBasedStatusBarAppearance
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
}
}
结果如下:
iOS 13 解决方案
UINavigationController
是(谁知道🙃)的子类!UIViewController
因此,在显示导航控制器中嵌入的视图控制器时,您并没有真正呈现嵌入式视图控制器;您正在展示导航控制器!,作为 的子类 继承 和 ,您可以根据需要进行设置。UINavigationController
UIViewController
preferredStatusBarStyle
childForStatusBarStyle
以下任何方法都应该有效:
- 选择完全退出深色模式
- 在 中,添加以下属性:
info.plist
- 键 - (又名。“用户界面样式”)
UIUserInterfaceStyle
- 价值 - 轻
- 键 - (又名。“用户界面样式”)
- 在 中,添加以下属性:
重写
UINavigationController
中的preferredStatusBarStyle
preferredStatusBarStyle
(文档)- 视图控制器的首选状态栏样式子类或扩展
UINavigationController
class MyNavigationController: UINavigationController { override var preferredStatusBarStyle: UIStatusBarStyle { .lightContent } }
或
extension UINavigationController { open override var preferredStatusBarStyle: UIStatusBarStyle { .lightContent } }
重写
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 } }
您可以返回上面想要的任何视图控制器。我推荐以下方法之一:
注意:如果您决定对 UINavigationController
进行子类化,请记住通过 IB 中的身份检查器将该类应用于导航控制器。
PS 这适用于 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 = 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 生命周期/iOS 14.0 的 App:
我需要动态更改状态栏文本颜色,但无法访问,因为 SwiftUI 生命周期不存在。window.rootViewController
SceneDelegate
我终于找到了 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
}
}
}
}
然后,您可以通过使用 或 view 修饰符或调用 径直。.statusBarStyle(.darkContent)
.statusBarStyle(.lightContent)
UIApplication.setStatusBarStyle(.lightContent)
不要忘记在 Info.plist 中将“查看基于控制器的状态栏外观”设置为“是”。
Xcode 似乎不断改变这一点,所以这是最新的。
截至 2021 年 - Swift 5、Xcode 12
要将状态栏更改为白色,请执行以下操作:
- 打开 Info.plist。
- 添加键并将值设置为 (false)。人类可读的版本是 .
UIViewControllerBasedStatusBarAppearance
No
"View controller-based status bar appearance"
- 添加键并将值设置为(即 )。
UIStatusBarStyle
UIStatusBarStyleLightContent
"Light Content"
评论
就我而言,没有任何帮助。我试图在嵌入 中的颜色处更改颜色,而 又以模态方式呈现。这种方式不起作用:StatusBar
ViewController2
NavigationController
ViewController1
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 ViewController2
modalPresentationCapturesStatusBarAppearance
此属性的默认值为 false。
当您通过调用 present(_:animated:completion:) 方法,状态栏外观控件 从呈现的视图控制器传输到呈现的视图控制器 仅当提供的控制器的 modalPresentationStyle 值为 UIModalPresentationStyle.fullScreen。 通过将此属性设置为 true, 指定显示的视图控制器控件状态栏 外观,即使以非全屏方式呈现。
系统忽略视图控制器的此属性值 全屏呈现。
这个答案是在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
iOS 17+ 更新
考虑其下的应用程序,并由操作系统本身自动修改状态栏样式。
评论