我的应用程序背景是黑色的,但在iOS 7中,状态栏变成了透明的。所以我什么也看不见,只有角落里的绿色电池指示灯。如何将状态栏文本颜色改为白色,就像在主屏幕上一样?
这在iOS 7 UI过渡指南中有记录,你需要一个苹果开发者ID才能直接访问。相关节选:
因为状态栏是透明的,所以它后面的视图是透视的。[…使用UIStatusBarStyle常量来指定状态栏内容应该是暗的还是亮的: UIStatusBarStyleDefault显示黑色内容。[…] UIStatusBarStyleLightContent显示轻内容。当状态栏后面是黑色内容时使用。
也可能令人感兴趣:
在iOS 7中,你可以通过单个的vew控制器控制状态栏的样式,并在应用程序运行时更改它。要选择这种行为,添加UIViewControllerBasedStatusBarAppearance键到应用程序的信息。plist文件并赋值YES。
我强烈建议你浏览一下这个文档,同样,你可以用你的苹果开发者ID访问这个文档。
这似乎是当前Xcode和iOS 7的一个问题。
在苹果开发者论坛*的“iOS 7 Beta Livability”中搜索UIStatusBarStyleLightContent(目前有32个帖子),可以看到苹果开发者论坛上的一些相关内容。
我在把它调到浅色的时候偶然发现的。
(这只是对Aaron回答的一个补充。)
在.plist文件中设置UIViewControllerBasedStatusBarAppearance为YES。 在viewDidLoad做一个[self setNeedsStatusBarAppearanceUpdate]; 增加如下方法: ——(UIStatusBarStyle) preferredStatusBarStyle { 返回UIStatusBarStyleLightContent; }
注意:这并不适用于UINavigationController内部的控制器,请参阅Tyson的评论如下:)
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())
to
window.rootViewController = HostingController(rootView: ContentView())
或者,你可以选择退出基于视图控制器的状态栏外观:
在Info.plist中设置“基于视图控制器的状态栏外观”为“NO”。 调用[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
注意:此方法在iOS9中已弃用。在UIViewController上使用preferredStatusBarStyle代替。(见苹果开发者库)
如果你有一个通过Interface Builder创建的嵌入式导航控制器,请确保在管理导航控制器的类中设置以下内容:
-(UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}
这应该就是你所需要的。
您不需要编写任何代码就可以做到这一点! 做以下使状态栏文本颜色白色通过整个应用程序
在你的项目plist文件中:
状态栏样式:透明黑色样式(alpha值为0.5) 基于视图控制器的状态栏外观:NO 状态栏初始隐藏:NO
对我来说,使用其他答案(以及其他来源/文档)中的所有东西都没有发生任何事情。真正有帮助的是在XIB中将导航栏样式设置为“黑色”。这在没有任何代码的情况下将文本更改为白色。
这适用于Golden Master iOS7和Xcode 5 GM种子和2013年9月18日发布的iOS7 SDK(至少导航控制器隐藏):
中的UIViewControllerBasedStatusBarAppearance设置为NO Info.plist。 在ViewDidLoad方法或任何地方,你想改变的地方 状态栏样式: [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
Xcode GM Seed的答案更新:
在信息。plist将基于视图控制器的状态栏外观设置为NO 在项目中,设置: 在ViewDidLoad: [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
我做了一些不同的事情,这对我很有效。
在没有更改代码的情况下,我像这样配置了.plist文件:
基于控制器的状态栏外观>否 状态栏样式> UIStatusBarStyleLightContent(简单字符串)
我希望这能有所帮助。
edit
对于每个视图控制器,我改变“状态栏”的模拟度量属性,在故事板中,从“推断”到“轻内容”
注:最高赞数的答案不适用于iOS 7 / 8
在信息。plist设置“视图基于控制器的状态栏外观”为NO
在AppDelegate中添加
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
to
- (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的首选项。
确保你将故事板场景中的类引用从muinavigationcontroller更改为你的子类(例如下面例子中的MyNavigationController)。
(以下方法对我有用。如果你的应用程序是基于TabBar,你会想做类似的事情通过子类化UITabBarController,但我还没有尝试出来)。
@interface MyNavigationController : UINavigationController
@end
@implementation MyNavigationController
- (UIStatusBarStyle)preferredStatusBarStyle
{
return self.topViewController.preferredStatusBarStyle;
}
@end
删除。plist文件中基于视图控制器的状态栏外观(如果你有create)并重新创建它。 设置状态栏样式为不透明黑色样式
在appDelegate中,在didFinishLaunching下添加以下代码。
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
简单地调用
[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];
在
-(BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
}
我的AppDelegate的方法在iOS7中非常适合我。
你可以从info.plist:
1)“基于视图控制器的状态栏外观”设置为“NO”
2)“状态栏样式”设置为“UIStatusBarStyleLightContent”
done
在ios7上,如果你想使用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];
iOS 7允许单独的视图控制器来决定状态栏的外观,如苹果开发者文档所述:
ios7允许视图控制器在应用程序运行时调整状态栏的样式。动态改变状态栏样式的一个好方法是实现preferredStatusBarStyle并在一个动画块内更新状态栏外观并调用setNeedsStatusBarAppearanceUpdate。
全局设置状态栏外观是一个两步过程。
首先,你需要告诉iOS你不想按视图来设置状态栏外观。
然后你需要负责并实际设置新的全局状态栏样式。
要禁用逐视图状态栏控件,您需要在Info.plist中设置基于视图控制器的状态栏外观属性。
打开项目导航器,选择iOS应用程序的项目,然后选择信息选项卡。
将鼠标悬停在一行上,然后单击出现的加号,将新属性添加到.plist。
在Key字段中输入基于视图控制器的状态栏外观,然后确保Type字段设置为Boolean。最后,在Value字段中输入NO。
要为状态栏设置全局样式,在Info选项卡下添加另一个属性,键为状态栏样式,类型为字符串,值为不透明黑色样式。
下面是一篇博客文章,其中有更多的细节和一些示例代码:
http://codebleep.com/setting-the-status-bar-text-color-in-ios-7/
只需以下两步:
步骤1:
在项目目标的Info选项卡下,添加行:
UIViewControllerBasedStatusBarAppearance,设置值NO。
步骤2:
在项目AppDelegate.m中:
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
…
[application setStatusBarStyle:UIStatusBarStyleLightContent];
…
}
这些对我来说都没用,所以这里有一个有效的解决方案……
在信息。Plist,添加一行:
UIViewControllerBasedStatusBarAppearance,并设置值为NO。
然后在AppDelegate的didFinishLaunchingWithOptions中添加这些行:
[application setStatusBarHidden:NO];
[application setStatusBarStyle:UIStatusBarStyleLightContent];
这对我来说真是小菜一碟。
去你的应用的info.plist。
“查看基于控制器的状态栏外观”设置为“否” 设置状态栏样式为UIStatusBarStyleLightContent
然后转到你的应用程序的委托,并粘贴下面的代码,你设置你的窗口的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中添加key UIViewControllerBasedStatusBarAppearance并将value设置为false 添加键UIStatusBarStyle和设置值UIStatusBarStyleLightContent
这招对我很管用:
在plist中设置UIViewControllerBasedStatusBarAppearance为YES rootViewController需要方法实现 ——(UIStatusBarStyle) preferredStatusBarStyle
因为我的rootViewController是由Cocoapods (JASidePanelController)管理的,我通过一个类别添加了这个方法:
#import "JASidePanelController+StatusBarStyle.h"
@implementation JASidePanelController (StatusBarStyle)
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
@end
对于Xcode 5.1:
在.plist的NO中添加“基于视图控制器的状态栏外观”。
在AppDelegate中添加:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
这是所有!
在AppDelegate。M,添加以下内容。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}
在Plist文件中,将“基于视图控制器的状态栏外观”设置为NO。
总结一下,编辑你的项目信息。Plist并添加:
基于视图控制器的状态栏外观:NO
状态栏样式:不透明的黑色样式
或者如果你有raw key/value plist
uiviewcontrollerbasedstatusbar外观:NO
UIStatusBarStyle:不透明黑色风格
如果你仍然想使用基于视图控制器的状态栏的信息外观。plist设置为YES,这意味着你可以改变每个视图控制器的状态栏,在ViewDidLoad的状态栏中使用下面的白色文本:
[[[self navigationController] navigationBar] setBarStyle:UIBarStyleBlackTranslucent];
让我来完整地回答你的问题。改变状态栏文本的颜色非常简单,但是在ios7中对新手来说有点混乱。
如果你试图通过选择视图控制器并在右侧选择模拟度量来将Storyboard中的颜色从黑色改为白色,它不会工作,我不知道为什么。它应该通过这样的改变来工作,但无论如何。
其次,你不会在你的plist中找到UIViewControllerBasedStatusBarAppearance属性,但默认情况下它不在那里。你必须自己添加它,点击+按钮,然后设置为NO。
ios7状态栏的文本颜色
最后,你需要到AppDelegate。然后在didFinishLaunchingWithOptions方法中添加如下内容,添加如下一行:
[[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的评论部分,并告知您正在使用此代码更改状态栏的颜色。
是的,不要忘记下面的内容。
在iOS 8中: add 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
}
在信息。plist设置“视图基于控制器的状态栏外观”为NO
在AppDelegate中添加
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
如果你的应用程序需要有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];
}
如果你想用Swift得到同样的结果,你可以在你的AppDelegate.swift文件中使用下面的代码:
UINavigationBar.appearance().barStyle = .BlackTranslucent
你的状态栏的文本将是白色的:-)!
你不需要为此做任何代码
你需要在信息中添加“基于控制器的状态栏外观”键。请填写如下:
并将其值类型设置为布尔值,值设置为NO。 然后单击项目设置,然后单击“常规”选项卡并在“部署信息”下将首选状态栏样式设置为。light,如下所示:
这是它。
只需改变1)信息。plist基于控制器的状态栏外观->否 和写 2)
[[UIApplication
sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
in
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
转到项目->目标, 然后设置“状态栏样式”为“亮”。它使状态栏从启动屏幕变成白色。 然后在Info.plist中将“基于视图控制器的状态栏外观”设置为“NO”。
在Xcode中最简单的方法(不需要任何编码)是:
添加基于视图控制器的状态栏外观到您的信息。plist,设置为NO。 现在,转到项目目标,在部署信息中,你会发现一个状态栏样式的选项。将此选项的值设置为Light。
你会看到白色状态栏。
我必须为swift和导航控制器做些什么
extension UINavigationController {
override open var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
Swift 3 - Xcode 8。
如果你想让状态栏最初隐藏在启动屏幕上,那么试试这个,
步骤1:将以下内容添加到info.plist。
查看基于控制器的状态栏外观值NO 状态栏初始隐藏值为YES
第二步:在didFinishLaunchingWithOptions方法中写入。
UIApplication.shared.isStatusBarHidden = false
UIApplication.shared.statusBarStyle = UIStatusBarStyle.lightContent
非常简单的方法来改变状态栏的颜色。 创建navigation Controller的子类。
在view didload方法中编写以下代码。 在所有视图控制器中执行此代码
self.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName :
[UIColor whiteColor],
NSFontAttributeName:[UIFont boldSystemFontOfSize:19]};
在Swift 3非常简单,只需2步。 去你的信息。将基于视图控制器的状态栏外观更改为“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
}
改变所有viewcontroller的状态栏文本颜色
斯威夫特3
if在Info.plist中查看基于控制器的状态栏外观= YES
然后使用这个扩展为所有NavigationController
extension UINavigationController
{
override open var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
如果没有UINavigationController,只有UIViewController,那么使用下面的代码:
extension UIViewController
{
override open var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
objective - c
创建类别类
对于UIView控制器
在ui + StatusBarStyle.h
@interface UIViewController (StatusBarStyle)
@end
在ui + 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];
}
以下是苹果关于状态栏更改的指导方针/说明。状态栏只允许显示暗&亮(而&黑)。
这里是-如何改变状态栏样式:
如果你想设置状态栏的风格,应用程序级别,然后设置UIViewControllerBasedStatusBarAppearance为NO在你的。plist文件。
如果你想在视图控制器级别设置状态栏样式,那么按照以下步骤:
如果你只需要在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
}
}
结果如下:
在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 Lifecycle / iOS 14.0的应用程序:
我需要动态更改状态栏文本颜色,无法访问窗口。rootViewController,因为SwiftUI生命周期中不存在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
}
}
}
}
然后你可以通过使用。statusbarstyle (. darkcontent)或。statusbarstyle (. lightcontent)视图修饰符来改变状态栏文本的颜色,或者直接调用例如UIApplication.setStatusBarStyle(. lightcontent)。
不要忘记在Info.plist中设置“基于视图控制器的状态栏外观”为“YES”。
Xcode似乎一直在改变这个,所以这是最新的。
截至2021年,Swift 5, Xcode 12
设置状态栏为白色。
打开你的Info.plist。 添加键UIViewControllerBasedStatusBarAppearance并将值设置为No (false)。人类可读的版本是“基于视图控制器的状态栏外观”。 添加键UIStatusBarStyle和设置值UIStatusBarStyleLightContent(即“轻内容”)。
对我来说,什么都没用。我试图改变状态栏颜色在ViewController2,这是嵌入在NavigationController,这反过来,从ViewController1被模态地呈现。这种方法行不通:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .darkContent
}
什么都没有发生,直到我找到了这个解决方案: 将这一行添加到ViewController1
导航控制器。modalPresentationCapturesStatusBarAppearance = 真正的
let navigationController = UINavigationController(rootViewController: viewController2)
navigationController.modalPresentationStyle = .overFullScreen
navigationController.modalTransitionStyle = .crossDissolve
navigationController.modalPresentationCapturesStatusBarAppearance = true
self.present(navigationController, animated: true)
所以如果你的导航方案类似于ViewController1呈现的ViewController2,尝试modalPresentationCapturesStatusBarAppearance属性呈现的一个
文档:
The default value of this property is false. When you present a view controller by calling the present(_:animated:completion:) method, status bar appearance control is transferred from the presenting to the presented view controller only if the presented controller's modalPresentationStyle value is UIModalPresentationStyle.fullScreen. By setting this property to true, you specify the presented view controller controls status bar appearance, even though presented non-fullscreen. The system ignores this property’s value for a view controller presented fullscreen.
这个答案是在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
推荐文章
- 如何停止不必要的UIButton动画标题变化?
- 是否有可能更新一个本地化的故事板的字符串?
- 以编程方式获取Bundle Identifier
- 为iPad和iPhone设计输入按钮
- 如何在我的iPhone应用程序中使用NSError ?
- 我的预发行应用已经在iTunes Connect中“处理”了一周多,这是怎么回事?
- Xcode iOS项目只显示“我的Mac 64位”,但不显示模拟器或设备
- Objective-C中的自动引用计数不能防止或减少什么样的泄漏?
- 在Xcode 9中如何从打开的多个模拟器中退出或关闭单个模拟器?
- 如何使用Swift播放声音?
- UINavigationBar自定义返回按钮没有标题
- 如何精确地以毫秒为单位记录方法的执行时间?
- 在整个UIWindow中获取UIView的位置
- 如何解散ViewController在Swift?
- 保存字符串到NSUserDefaults?