如何在 iOS 中更改状态栏文本颜色
Posted
技术标签:
【中文标题】如何在 iOS 中更改状态栏文本颜色【英文标题】:How to change Status Bar text color in iOS 【发布时间】:2013-07-16 14:11:22 【问题描述】:我的应用程序有深色背景,但在 ios 7 中,状态栏变得透明。所以我在那里什么都看不到,只有角落里的绿色电池指示灯。如何将状态栏文本颜色更改为白色,就像在主屏幕上一样?
【问题讨论】:
这个链接有关于这个问题的有趣信息:doubleencore.com/2013/09/… 看看我的 naswer 以获得更好的解决方案 ***.com/questions/17678881/… Xcode 似乎一直在改变这一点,所以我建议向下滚动以查找更新的解决方案(例如,Super simple answer as of 2021)。 【参考方案1】:在 .plist 文件中将 UIViewControllerBasedStatusBarAppearance
设置为 YES
。
在viewDidLoad
中做一个[self setNeedsStatusBarAppearanceUpdate];
添加如下方法:
- (UIStatusBarStyle)preferredStatusBarStyle
return UIStatusBarStyleLightContent;
注意:这不适用于UINavigationController
内部的控制器,请参阅Tyson's comment below :)
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
的新 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())
【讨论】:
我不需要第 2 步。 似乎不适用于带有 Xcode5-DP5 的 iOS 7 Beta 5。 preferredStatusBarStyle 似乎没有被调用。 UIViewControllerBasedStatusBarAppearance 更改为在 Xcode 5 GM 种子中查看基于控制器的状态栏外观 得到了 Xcode GM Seed 的答案: 1. 在 Info.plist 中将 View controller-based status bar appearance 设置为 NO 2. 在 appDelegate 中,在 appDidFinishLaunching 方法中,放入 [[UIView appearance] setTintColor:[ UIColor whiteColor]]; UINavigationController 是个特例,上面的不行。只是花了几个小时在这个问题上摸不着头脑。请参阅此处以获取解决方案:***.com/a/19513714/505457【参考方案2】:或者,您可以选择退出基于视图控制器的状态栏外观:
-
在您的
Info.plist
中将View controller-based status bar appearance
设置为NO
。
致电[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
注意:此方法在 iOS9 中已被弃用。在 UIViewController 上使用 preferredStatusBarStyle
。 (见Apple Developer Library)
【讨论】:
这是一条更好、更容易的路线。 无需编码。这一切都可以从 plist 中完成:(1)将“基于视图控制器的状态栏外观”设置为 NO,(2)将“状态栏样式”设置为“不透明黑色样式”。 (原始值为 UIViewControllerBasedStatusBarAppearance -> NO 和 UIStatusBarStyle -> UIStatusBarStyleBlackOpaque) 请注意,您必须将相关的 info.plist 值设置为 NO 才能正常工作。 @gothicdev:不错的收获。会接受你的答案,因为它是最干净的。条形样式的灯光选项可以是:UIStatusBarStyleLightContent 此方法已在 iOS 9 中弃用。【参考方案3】:您无需编写任何代码即可做到这一点! 执行以下操作以使整个应用程序的状态栏文本颜色为白色
你的项目plist文件:
状态栏样式:Transparent black style (alpha of 0.5)
查看基于控制器的状态栏外观:NO
状态栏最初是隐藏的:NO
【讨论】:
我不知道事情是否发生了变化,但是 XCode 无法识别 UIStatusBarStyleLightContent 值,并且在任何文档中都找不到......虽然它似乎有效。 这个也在启动画面上改变了它,而只是在导航器上设置它不会......荣誉! 绝对是完成这项工作的最简单方法,并且如上所述也适用于启动画面。plist info
中没有任何名为 UIStatusBarStyleLightContent
的东西,但是有 Transparent Black
可以做同样的事情:) 另外,您需要添加 View controller-based status bar appearance
,因为它最初不存在这就是让它工作所需要的一切:)
对于像我这样的懒人,复制过去吧:<key>UIStatusBarStyle</key> <string>UIStatusBarStyleLightContent</string> <key>UIViewControllerBasedStatusBarAppearance</key> <false/>
【参考方案4】:
注意:投票最多的答案不适用于 iOS 7 / 8
在 Info.plist 中将“查看基于控制器的状态栏外观”设置为 NO
在 AppDelegate 中添加
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
到
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
...
此解决方案适用于 iOS 7 / 8。
【讨论】:
在 iOS 9 中已弃用。:-/【参考方案5】:对我来说,使用其他答案(以及其他来源/文档)中的所有内容都没有发生任何事情。有什么帮助是在 XIB 中将导航栏样式设置为“黑色”。这将文本更改为白色,根本没有任何代码。
【讨论】:
在设备中,上面的答案都对我有用,但这个答案。我认为它告诉了有关新系统的所有信息,您必须将 navigation_bar 设置为 BLACK 以使 status_bar 文本为 WHITE。 在经历了很多事情之后,这就是最终的工作。样式设置为默认值。改变了这一点,去掉了所有其他的状态栏黑客,它就可以工作了。 如果您不想在 IB 中设置所有导航栏,也可以设置其外观代理。 [[UINavigationBar 外观] setBarStyle:UIBarStyleBlack]; 在 iOS7 Storyboard 中对我不起作用。看起来这可能是其他东西的副作用? 我想确认一下,以上所有答案都对我不起作用。在图像之后,状态栏文本看起来是白色的。但我再重复一遍,上面的 Xcode 6.2 和 iOS 8.2 的 ANSWERS 不起作用。【参考方案6】:这些都不适合我,所以这是一个可行的解决方案......
在Info.plist
,添加一行:
UIViewControllerBasedStatusBarAppearance
,并设置值NO
。
然后在didFinishLaunchingWithOptions
的 AppDelegate 中,添加这些行:
[application setStatusBarHidden:NO];
[application setStatusBarStyle:UIStatusBarStyleLightContent];
【讨论】:
这个解决方案对我有用,而上面的那些没有。 太棒了,但是这个 UIViewControllerBasedStatusBarAppearance 转换为相同的:自动查看基于控制器的状态栏外观:)【参考方案7】:您无需为此编写任何代码
需要在info.plist中添加“查看基于控制器的状态栏外观”键,如下:
& 将其值类型设置为 Boolean & 将值设置为 NO。 然后点击项目设置,然后点击常规选项卡&在部署信息下将首选状态栏样式设置为.Light,如下所示:
就是这样。
【讨论】:
我喜欢你的方法!就我而言,我试图弄清楚如何使状态栏样式仅在全屏时变亮(无导航栏)。然后,我意识到所有其他屏幕都应该适合相同的灯光样式。所以一个好的解决方案是为整个事情设置。谢谢! (: 如果您在应用运行时不需要更改此设置。这是最好的方法。 这种方法确实有效,但它在 iPad 上引入了一个奇怪的问题。如果您的应用程序支持深度链接,并且当您通过深度链接启动应用程序时,状态栏上显示的反向链接就会消失。 最好最简单的一个。 对我来说最好的解决方案:D【参考方案8】:只需两步:
第 1 步:
在project target
的信息选项卡下,添加行:
UIViewControllerBasedStatusBarAppearance
,设置值NO
。
第 2 步:
项目中AppDelegate.m
:
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
…
[application setStatusBarStyle:UIStatusBarStyleLightContent];
…
【讨论】:
我喜欢这个答案,因为这是我第一次使用“应用程序”参数)) 点符号,这将是完美的;)【参考方案9】:这适用于 2013 年 9 月 18 日发布的 Golden Master iOS 7 和 Xcode 5 GM 种子和 iOS7 SDK(至少隐藏导航控制器):
将the UIViewControllerBasedStatusBarAppearance
设置为NO
Info.plist
.
在ViewDidLoad
方法或任何地方,你想在哪里改变
状态栏样式:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
【讨论】:
UIViewControllerBasedStatusBarAppearance 默认值似乎是 YES。 “应用程序默认使用新的基于视图控制器的状态栏管理系统。要选择退出,请将 UIViewControllerBasedStatusBarAppearance 键的值 NO 添加到 Info.plist。” [bgr.com/2013/09/10/ios-7-gm-change-log-release-notes/] 耶!!将 UIViewControllerBasedStatusBarAppearance 设置为 NO 后,状态栏隐藏在视图中。 应该应用于所有的viewdidload吗? 您可以在 appDelegates didFinishLoading 方法中添加它。或者如果你不想改变它,可以在第一个视图中查看 viewDidLoad 方法。 太棒了,这个成功了。简单而出色的编码。【参考方案10】:如果你的 UIViewController 在 UINavigationController 中,你必须设置 BarStyle:
-[UINavigationBar setBarStyle:UIBarStyleBlack]
原答案在这里
https://devforums.apple.com/message/844264#844264
【讨论】:
不,这只是使导航栏颜色与状态栏文本颜色相同。这隐藏了问题,而不是解决它! 在 iOS7 中,如果视图包含 UINavigationController,状态栏会模仿 UINavigationBar,所以在很多情况下,这是正确的答案。【参考方案11】:如果您有通过Interface Builder 创建的嵌入式导航控制器,请务必在管理您的导航控制器的类中设置以下内容:
-(UIStatusBarStyle)preferredStatusBarStyle
return UIStatusBarStyleLightContent;
这应该就是你所需要的。
【讨论】:
这是在没有情节提要和 xib 的应用程序中对我有用的唯一解决方案。对非 IB 用户也应该有帮助。 当我需要在每个视图控制器中设置不同的样式时,这对我来说是完美的 如果你想保留“基于视图控制器的状态栏外观”设置为是,这是要走的路。谢谢!【参考方案12】:我在 Swift 项目中使用 Xcode 6 beta 5,用于 iOS 7 应用程序。
这是我所做的,并且有效:
info.plist:
【讨论】:
谢谢,看来只有您的解决方案才能使用最新版本的 IOS7 此解决方案在加载应用时在启动屏幕中显示状态栏。 解决了我在 xCode 7.1 中的问题。最新版本。苹果忘记了一些重要的部分来使某些东西发挥作用。再次。【参考方案13】:转到Project
-> Target
,
然后将Status Bar Style
设置为Light
。它使启动屏幕上的状态栏变为白色。
然后在Info.plist
中设置View controller-based status bar appearance
等于NO
。
【讨论】:
将实际的View controller-based status bar appearance equal
设置为NO
的第二部分是我缺少的部分。谢谢
完美,在我看来应该是最正确的答案。谢谢【参考方案14】:
在 AppDelegate.m 中,添加以下内容。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
并在 Plist 文件中,将“基于控制器的状态栏外观”设置为 NO。
【讨论】:
【参考方案15】:
在 Swift 3 中非常简单,只需 2 个步骤。
转到您的 info.plist 并将密钥 View controller-based status bar appearance
更改为“NO”。
然后在 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
【讨论】:
这真是太棒了兄弟 :) 谢谢。 这样做在 iOS 9 中已被弃用,应该在 rootviewcontroller 上执行此操作 override var preferredStatusBarStyle: UIStatusBarStyle return .lightContent 【参考方案16】:只需在应用程序代理中:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
在 Swift 5 中,按照以下步骤操作:
-
在 Info.plist 中添加键
UIViewControllerBasedStatusBarAppearance
并将值设置为 false
添加键UIStatusBarStyle
并将值设置为UIStatusBarStyleLightContent
【讨论】:
唯一对我有用的答案。 但是为此我们需要选择退出查看基于控制器的状态栏外观。 在 iOS9 中已弃用【参考方案17】:嗯,这对我来说真的是小菜一碟。
转到您应用的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];
宾果游戏。它对我有用。
【讨论】:
我认为这是正确的答案(plist 的一部分)...为什么我要在 didfinishlaunchingwithoptions 上添加静态代码...如果您需要整个应用程序的颜色相同,这是正确的方法【参考方案18】:iOS 7 允许各个视图控制器确定状态栏的外观,如 Apple 开发人员文档所述:
iOS 7 让视图控制器能够在应用运行时调整状态栏的样式。动态更改状态栏样式的一个好方法是实现
preferredStatusBarStyle
,并在动画块中更新状态栏外观并调用setNeedsStatusBarAppearanceUpdate
。
全局设置状态栏外观分为两步。
首先,您需要告诉 iOS 您不想在逐个视图的基础上设置状态栏外观。
然后你需要负责并实际设置新的全局状态栏样式。
要禁用逐视图状态栏控制,您需要在Info.plist
中设置View controller-based status bar appearance
属性。
打开 Project Navigator 并为您的 iOS 应用选择项目,然后选择 Info 选项卡。
将鼠标悬停在一行上,然后点击出现的加号,将新属性添加到您的.plist
。
在 Key 字段中输入 View controller-based status bar appearance
,然后确保 Type 字段设置为 Boolean
。最后,在 Value 字段中输入NO
。
要为状态栏设置全局样式,请在“信息”选项卡下添加另一个属性,其键为Status bar style
,类型为String
,值为Opaque black style
。
这是一篇包含更多细节和一些示例代码的博文:
http://codebleep.com/setting-the-status-bar-text-color-in-ios-7/
【讨论】:
谢谢。我的问题是我没有看到“基于视图控制器的状态栏外观”的类型设置为字符串。 “手动”编辑 .plist 文件并输入布尔值清除了一切。【参考方案19】:为 Xcode GM Seed 更新了答案:
在Info.plist
中将View controller-based status bar appearance
设置为NO
在项目中,设置:
在 ViewDidLoad 中:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
【讨论】:
这改变了标签栏,而不是我的状态栏。【参考方案20】:不需要做额外的,只需在你的viewController中写下这段代码,让状态栏颜色变白
- (UIStatusBarStyle)preferredStatusBarStylereturn UIStatusBarStyleLightContent;
【讨论】:
实现后放到ViewController.m下。它最简单,效果很好!谢谢你莫希特!【参考方案21】:我认为所有答案都不能真正指出问题所在,因为它们都适用于特定场景。但是,如果您需要涵盖所有情况,请遵循以下几点:
根据您需要状态栏灯样式的位置,您应该始终牢记以下 3 点:
1)如果您需要在启动屏幕或其他您无法控制的位置(不是在视图控制器中,而是在一些系统控制的元素/时刻,如启动屏幕)中使用状态栏强> 你去你的项目设置
2) 如果您在导航控制器中有控制器 您可以在界面生成器中进行如下更改:
a) 选择导航控制器的导航栏
b) 然后将导航栏的样式设置为“黑色”,因为这意味着您的状态栏下方会有一个“黑色”-> 深色背景,因此会将状态栏设置为白色
或者在代码中做如下
navigationController?.navigationBar.barStyle = UIBarStyle.Black
3) 如果您只有控制器需要拥有自己的状态栏样式,并且它没有作为 UINavigationController 嵌入到某些容器结构中
在代码中为控制器设置状态栏样式:
【讨论】:
请解释一下您的情况,我会尽力提供帮助 我必须将 StatusBarIsIntiallyHidden = NO 添加到 plist 以及 ViewControllerBasedApplicationStatusBarAppearnce = NO 添加到 plist。然后这可以使用第一部分 您是否有一个与第一个加载视图控制器具有相同“图像”的启动画面?此外,在目标的“信息”部分,您可以尝试将“隐藏状态栏”设置为 false 并避免处理您的 .plist。 “StatusBarIsIntiallyHidden”标志 我没有。它正在使用生成的默认 xib。 我在 xCode 7.1 中创建一个新项目时实际上发现了这个问题,这就是为什么我觉得它很奇怪【参考方案22】:这里是Apple Guidelines/Instruction,关于状态栏的变化。状态栏中只允许使用深色和浅色(白色和黑色)。
这里是 - 如何更改状态栏样式:
如果你想设置状态栏样式,应用程序级别然后在你的`.plist'文件中设置UIViewControllerBasedStatusBarAppearance
到NO
。
如果您想设置状态栏样式,请在视图控制器级别执行以下步骤:
-
如果您只需要在 UIViewController 级别设置状态栏样式,请在
.plist
文件中将 UIViewControllerBasedStatusBarAppearance
设置为 YES
。
在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
结果如下:
【讨论】:
【参考方案23】:Xcode 似乎不断地改变这一点,所以这是最新的。
截至 2021 年 - Swift 5、Xcode 12
要将状态栏更改为白色:
-
打开您的 Info.plist。
添加键
UIViewControllerBasedStatusBarAppearance
并将值设置为No
(false)。人类可读的版本是"View controller-based status bar appearance"
。
添加键UIStatusBarStyle
并将值设置为UIStatusBarStyleLightContent
(即"Light Content"
)。
【讨论】:
这对我有用,也是最容易理解的。【参考方案24】:简单调用
[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];
在
-(BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
AppDelegate
的方法在 iOS7 中非常适合我。
【讨论】:
哇,这里有很多废话,但这个答案对我有用。我正在使用 Xcode 6 和 iOS 8 SDK 优秀,在 iOS 9 中使用View controller-based status bar appearance = NO
为我工作【参考方案25】:
这在iOS 7 UI Transition Guide 中有记录,您需要 Apple 开发者 ID 才能直接访问。相关摘录:
因为状态栏是透明的,所以它后面的视图是透出来的。 [...] 使用
UIStatusBarStyle
常量来指定状态栏内容是深色还是浅色:
UIStatusBarStyleDefault
显示深色内容。 [...]
UIStatusBarStyleLightContent
显示轻量级内容。当状态栏后面有深色内容时使用。
也可能感兴趣:
在 iOS 7 中,您可以从单个 vew 控制器控制状态栏的样式,并在应用运行时更改它。要选择启用此行为,请将
UIViewControllerBasedStatusBarAppearance
键添加到应用程序的Info.plist
文件并为其指定值YES
。
我绝对建议您查看文档,同样,您可以使用您的 Apple 开发者 ID 访问该文档。
【讨论】:
我已经尝试过 [应用程序 setStatusBarStyle:UIStatusBarStyleLightContent];但实际上没有任何变化,文字颜色仍然是黑色 我很想得到更多帮助,但就像我说的,我对 iOS 开发过程还不够熟悉,不知道有什么建议。对不起! 1) 在 plist 中将 UIViewControllerBasedStatusBarAppearance 设置为 YES 2) 在 viewDidLoad 中执行 [self setNeedsStatusBarAppearanceUpdate]; 3) 添加如下方法:-(UIStatusBarStyle)preferredStatusBarStyle return UIStatusBarStyleLightContent; 【参考方案26】:对于 Swift 5,我添加了以下几行:
override func viewDidAppear(_ animated: Bool)
navigationController?.navigationBar.barStyle = .black
override var preferredStatusBarStyle: UIStatusBarStyle
return .lightContent
【讨论】:
preferredStatusBarStyle 没有做任何事情。 .black 可以进入 viewDidLoad 就好了。【参考方案27】:我做了一些不同的事情,它对我有用。
在没有更改代码的情况下,我确实像这样配置了我的 .plist 文件:
查看基于控制器的状态栏外观 > 否 状态栏样式> UIStatusBarStyleLightContent(简单字符串)希望对你有帮助。
编辑
对于每个视图控制器,我将情节提要中“状态栏”的模拟指标属性从“推断”更改为“轻量内容”
【讨论】:
【参考方案28】:在 info.plist 中设置字段值 NO 查看基于控制器的状态栏外观并在目标>常规设置中设置 statusbar 样式灯。
【讨论】:
优胜者鸡肉晚餐【参考方案29】:如果您想使用 Swift 获得相同的结果,可以在 AppDelegate.swift 文件中使用此代码:
UINavigationBar.appearance().barStyle = .BlackTranslucent
你的状态栏的文本会是白色的:-) !
【讨论】:
【参考方案30】:总结一下,编辑你的项目Info.plist
并添加:
View controller-based status bar appearance
: NO
Status bar style
: Opaque black style
或者如果你有原始的键/值列表
UIViewControllerBasedStatusBarAppearance
: NO
UIStatusBarStyle
: Opaque black style
【讨论】:
这对我有用,而且比使用preferredStatusBarStyle
更轻松,因为您可以全局配置它(当然,这只对您的情况有用)以上是关于如何在 iOS 中更改状态栏文本颜色的主要内容,如果未能解决你的问题,请参考以下文章
如何在iOS 7上更改状态栏背景颜色和文本颜色? Warif Akhand Rishi
Flutter:不使用AppBar时如何在Android和iOS上更改状态栏文本颜色[重复]