override func preferredStatusBarStyle() -> UIStatusBarStyle {
return UIStatusBarStyle.LightContent;
}
在任何ViewController中使用上面的代码将特定视图控件的statusBar颜色设置为白色 对我来说在iOS8中不起作用 。有什么建议?使用UIApplication.sharedApplication方法,在整个应用程序的Info.plist中所需的更改后,颜色会发生变化。
// Change the colour of status bar from black to white
UIApplication.sharedApplication().statusBarStyle = .LightContent
如何更改某些必需和 特定ViewControllers 的状态栏颜色?
答案 0 :(得分:329)
在阅读了所有建议并尝试了一些内容之后,我可以使用以下步骤将其用于特定的viewcontrollers:
第一步:
打开您的info.plist并将名为“查看基于控制器的状态栏外观”的新密钥插入 否
第二步(只是解释,无需实现):
通常我们在应用程序中放入以下代码(_:didFinishLaunchingWithOptions :) AppDelegate的方法,
Swift 2
UIApplication.sharedApplication().statusBarStyle = .LightContent
Swift 3
UIApplication.shared.statusBarStyle = .lightContent
但会影响所有ViewControllers的statusBarStyle
。
那么,如何让这个适用于特定的ViewControllers - 最后一步:
打开要更改statusBarStyle
的viewcontroller文件,并将以下代码放入viewWillAppear()
,
Swift 2
UIApplication.sharedApplication().statusBarStyle = .LightContent
Swift 3
UIApplication.shared.statusBarStyle = .lightContent
此外,为该特定viewController实现viewWillDisappear()
方法并添加以下代码行,
Swift 2
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default
}
Swift 3
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
UIApplication.shared.statusBarStyle = UIStatusBarStyle.default
}
此步骤将首先更改特定视图控制器的statusBarStyle
,然后在特定视图控制器消失时将其更改回default
。未实施viewWillDisappear()
会将statusBarStyle
永久更改为新定义的UIStatusBarStyle.LightContent
答案 1 :(得分:69)
(截至2019年3月14日)
Swift 4 , Swift 4.2
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
答案 2 :(得分:26)
我遵循了本教程,它对我有用。但是,我不确定是否有任何警告。
https://coderwall.com/p/dyqrfa/customize-navigation-bar-appearance-with-swift
UIViewControllerBasedStatusBarAppearance
至false
。AppDelegate.swift
的第一个包含didFinishLaunchingWithOptions
的函数中,设置所需的颜色。 UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent
Swift 3更新 *
UIApplication.shared.statusBarStyle = .lightContent
答案 3 :(得分:17)
这里有十亿个答案,所以我想为什么不以扩展名的形式添加另一个(在@Cœur的帮助下)
extension UIApplication {
class var statusBarBackgroundColor: UIColor? {
get {
return (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor
} set {
(shared.value(forKey: "statusBar") as? UIView)?.backgroundColor = newValue
}
}
}
UIApplication.statusBarBackgroundColor = .blue
答案 4 :(得分:16)
在Info.plist中,您需要将基于View控制器的状态栏外观定义为任何值。
如果您将其定义为YES,那么您应该覆盖每个视图控制器中的preferredStatusBarStyle函数。
如果您将其定义为NO,则可以使用
在AppDelegate中设置样式UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
答案 5 :(得分:14)
override func viewWillAppear(animated: Bool) {
self.navigationController?.navigationBarHidden = true
UIApplication.sharedApplication().statusBarHidden = false
UIApplication.sharedApplication().statusBarStyle = .LightContent
let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
if statusBar.respondsToSelector("setBackgroundColor:") {
statusBar.backgroundColor = UIColor.redColor()
}
}
答案 6 :(得分:12)
带有NavigationController的Swift 4.2解决方案
第一步:
打开您的info.plist并在 YES 上插入一个名为“ 基于控制器的状态栏外观 ”或UIViewControllerBasedStatusBarAppearance
的新密钥,以允许每个VC使用自己的状态属性。
第二步
在每个VC中,像这样覆盖 preferredStatusBarStyle 属性:
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent //.default for black style
}
最后一步
覆盖自定义NavigationController类中的 preferredStatusBarStyle 属性:
class NavigationController : UINavigationController {
override var preferredStatusBarStyle : UIStatusBarStyle {
if let topVC = viewControllers.last {
//return the status property of each VC, look at step 2
return topVC.preferredStatusBarStyle
}
return .default
}
答案 7 :(得分:12)
Swift 3
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to: #selector(setter: UIView.backgroundColor)) {
statusBar.backgroundColor = UIColor.black
}
这是为特定视图控制器设置状态栏背景颜色的解决方案。
答案 8 :(得分:12)
SWIFT 2
我能够通过在viewWillAppear中添加以下内容来成功更改状态栏背景的外观:
let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
statusBar.backgroundColor = .redColor()
}
答案 9 :(得分:9)
for swift 3
的.plist
View controller-based status bar appearance = NO
AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Custom statubar
UIApplication.shared.isStatusBarHidden = false
UIApplication.shared.statusBarStyle = .lightContent
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
statusBar.backgroundColor = UIColor.gray
return true
}
答案 10 :(得分:8)
在我的情况下,我使用storyboard来组织我的视图控制器。我想更改所有状态栏样式。
您可以在下面看到。
Stars
View Controller是CPBaseNavigationController
,CPBaseNavigationController
是UINavigationController
的子类。
我尝试做下一个setps:
在AppDelegate.swift
func didFinishLaunchingWithOptions
中,添加
//change status bar color
UIApplication.sharedApplication().statusBarHidden = false
UIApplication.sharedApplication().statusBarStyle = .LightContent
但没有效果。
在StoryBoard中,找到Base Tab BarController
(上图中的图片)。选择Attributes Inspector
,将Sattus Bar
属性更改为Light Content
。这么糟糕,没效果
最后我明白了。在我的自定义导航控件CPBaseNavigationController
中,添加func preferredStatusBarStyle
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}
效果很好!
此外,9.0中已弃用statusBarStyle
,您可以使用-[UIViewController preferredStatusBarStyle]
。
答案 11 :(得分:8)
按照您的提及实施preferredStatusBarStyle
,并在self.setNeedsStatusBarAppearanceUpdate()
和ViewDidLoad
中致电UIViewControllerBasedStatusBarAppearance
同样在Info.plist中将YES
设置为YES
(默认情况下为viewDidLoad
)
目前尚不清楚为什么它不起作用。我需要检查代码。另外一个建议是
使用UIApplication.sharedApplication().statusBarStyle = .LightContent
viewWillDisappear
中的工作代码,并在查看获取消失{{1}}时将其更改为默认值。
答案 12 :(得分:7)
Swift 3.0 Xcode 8中的一切都更容易
在
之后使用App Delegate文件中的以下代码UINavigationBar.appearance().barStyle = .black
UINavigationBar.appearance().barTintColor = UIColor(red: 230, green: 32, blue: 31, alpha: 1.0)
插入:
double[] myList = new double[myIntegerValues.size()];
for (int i=0; i<myIntegerValues.size(); i++) {
myList[i] = (double) myIntegerValues.get(i);
}
答案 13 :(得分:7)
适用于基于导航的应用程序
var addStatusBar = UIView()
addStatusBar.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 20);
addStatusBar.backgroundColor = global().UIColorFromRGB(0x65b4d9)
self.window?.rootViewController?.view .addSubview(addStatusBar)
答案 14 :(得分:7)
Swift 3
//
// LoginController.swift
// Swift 3
//
// Created by The Crab on 17/01/2017.
// Copyright © 2017 Paxi Labs. All rights reserved.
//
import UIKit
class LoginController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setNeedsStatusBarAppearanceUpdate()
view.backgroundColor = UIColor(red: 61/255, green: 91/255, blue: 151/255, alpha: 1)
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
答案 15 :(得分:6)
(截至2020年6月10日)
快捷键5 (无需编辑.Plist
文件)
如果您使用的是Storyboard
,请转到NavigationController
,选择navigationBar
,单击Attributes Inspector
,然后更改style
。如果您需要light content
(白色状态栏),请对其进行设置,除了default
可以说是设置样式black
,如果您想使用dark content
>黑色状态栏)将其设置为default
。
默认(UIBarStyleDefault
)会导致黑色的前景UIStatusBarStyleDefault
状态栏。 UIBarStyleBlack
将显示一个UIStatusBarStyleLightContent
状态栏。
以编程方式
let nav = UINavigationController(rootViewController: rootViewController)
nav.navigationBar.barStyle = .default //gives you dark Content status bar
nav.navigationBar.barStyle = .black //gives you light content status bar
没有导航栏(编辑.Plist
)
将UIViewControllerBasedStatusBarAppearance
/ View controller-based status bar appearance
添加到您的info.plist
中,设置值为true
。
Override
您控制器中的preferredStatusBarStyle
属性
class ViewController: UIViewController {
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
}
答案 16 :(得分:6)
Swift 4 对于没有使用navigationViewController嵌入的特定ViewController,只需将其添加到ViewController文件即可。
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
答案 17 :(得分:3)
在Swift 5或xcode 11及更高版本中,将info.plist中的(基于控制器的状态栏外观)键设置为NO 然后转到项目目标并选择常规,将状态栏样式设置为深色或浅色
答案 18 :(得分:3)
我使用App Delegate
文件中的以下代码设置了特定颜色(RGB格式):
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
. . .
UIApplication.sharedApplication().statusBarHidden = false
UIApplication.sharedApplication().statusBarStyle = .LightContent
let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
statusBar.backgroundColor = UIColor.init(red: 0.1, green: 0.27, blue: 0.60, alpha: 1.0)
}
. . .
}
您还需要在Info.plist
文件中添加以下密钥:
查看基于控制器的状态栏外观,布尔值设置为否
答案 19 :(得分:2)
我遇到这个问题。对于全局更改状态栏颜色在视图中确实显示并且然后将其更改回视图确实像已接受的答案一样消失时我感觉不太好。信不信由你可以通过覆盖所需视图控制器上的preferredStatusBarStyle
来实现这一点。经过很长时间,这就是我所做的工作:
info.plist
中基于控制器的状态栏外观更改为“是”。preferredStatusBarStyle
来更改状态栏样式。modalPresentationCapturesStatusBarAppearance
设置为是。此外,如果你有嵌入式视图控制器,例如在导航控制器中,它会向最顶层的视图控制器询问状态栏样式。覆盖childViewControllerForStatusBarStyle
并传递嵌入式视图控制器应该可以工作,但它不适合我。所以我只是将嵌入式视图控制器首选状态栏作为首选状态栏样式返回。像这样:
override var preferredStatusBarStyle: UIStatusBarStyle {
if let topViewController = viewControllers.last {
return topViewController.preferredStatusBarStyle
}
return .default
}
答案 20 :(得分:2)
我可以建议你一个更简单的方法,
如果视图控制器的状态栏属性(例如隐藏/取消隐藏状态或样式)发生更改,请调用此方法。如果在动画块中调用此方法,则会将更改与动画块的其余部分一起设置动画。
在iOS 10.1中它适用于我。
目标C
[self setNeedsStatusBarAppearanceUpdate];
-(UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
<强>夫特强>
setNeedsStatusBarAppearanceUpdate()
var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
我很惊讶没有人指出这一点。无论如何喜欢:))
答案 21 :(得分:1)
Swift 3.0更新
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
UIApplication.shared.statusBarStyle = .lightContent
return true
}
答案 22 :(得分:1)
在我的故事板中,使用了什么,转到导航控制器,选择导航栏,单击属性检查器,然后将样式从默认更改为黑色。就是这样!
答案 23 :(得分:1)
完成这项工作的另一种非常简单的方法就是创建UINavigationController类的扩展。
由于覆盖preferredStatusBarStyle:
方法将无法正常工作,除非,所以我们在UINavigationController类中进行此操作。
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
答案 24 :(得分:1)
在Swift 4或4.2中
您可以在vc上添加
preferredStatusBarStyle
并将返回值设置为
.lightContent或.default
例如:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
答案 25 :(得分:0)
对于Xcode 10,您可以创建一个类并将其放在viewController类之前,可以在所有需要光内容状态栏的视图控制器中调用该类。
class UIViewControllerWithLightStatusBar: UIViewController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return UIStatusBarStyle.lightContent
}
}
现在在以下位置更改viewController类:
class YourViewController: UIViewControllerWithLightStatusBar {
...
}
仅此而已...
答案 26 :(得分:0)
我在 Swift 5,Swift 4.2 中使用这种方式。
将下一个值添加到Info.plist:
UIViewControllerBasedStatusBarAppearance =是
或
UIViewControllerBasedStatusBarAppearance = NO (以查看更改)
UIStatusBarHidden = NO
UIStatusBarStyle = UIStatusBarStyleDefault (如果要在启动时看到灯光状态栏文本,则设置为 UIStatusBarStyleLightContent )
然后将下面的代码放置到要查看浅色内容的特定视图控制器(要查看深色文本,请将preferredStatusBarStyle设置为 .darkContent )。
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
override func viewDidLoad() {
super.viewDidLoad()
if let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as? UIView {
statusBar.backgroundColor = .sunflowerYellow
}
}
答案 27 :(得分:0)
如果有人想更改状态栏的电池和文本颜色,如下图所示:
您可以在appdelegate类中使用以下代码。
UINavigationBar.appearance().barTintColor = UIColor(red: 234.0/255.0, green: 46.0/255.0, blue: 73.0/255.0, alpha: 1.0)
UINavigationBar.appearance().tintColor = UIColor.white
UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.white]
答案 28 :(得分:0)
有两种情况:
1。显示导航栏
1)将1UIViewControllerBasedStatusBarAppearance
/ View controller-based status bar appearance
添加到您的info.plist
中,设置值为true
。
2)覆盖自定义NavigationController类中的preferredStatusBarStyle属性:(来自@guillama)
class NavigationController : UINavigationController {
override var preferredStatusBarStyle : UIStatusBarStyle {
if let topVC = viewControllers.last {
//return the status property of each VC, look at step 2
return topVC.preferredStatusBarStyle
}
return .default
}
3)在特定的视图控制器中覆盖preferredStatusBarStyle
:
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
2。隐藏的导航栏
1)同上
2)不需要上面的第二步,您应该直接执行第三步。
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
答案 29 :(得分:0)
如果您正在寻找一种解决方案,如何将状态栏更改为自定义颜色,这是可行的解决方案。
let statusBarView = UIView()
view.addSubview(statusBarView)
statusBarView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
statusBarView.topAnchor.constraint(equalTo: view.topAnchor),
statusBarView.leftAnchor.constraint(equalTo: view.leftAnchor),
statusBarView.rightAnchor.constraint(equalTo: view.rightAnchor),
statusBarView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
])
statusBarView.backgroundColor = .blue
答案 30 :(得分:0)
警告
“ statusBarStyle”的设置在iOS 9.0中已被弃用:使用-[UIViewController preferredStatusBarStyle]
UIApplication.shared.statusBarStyle = .default
所以我的解决方案是这样的: 从导航控制器进行扩展:
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
if let topViewController = presentedViewController{
return topViewController.preferredStatusBarStyle
}
if let topViewController = viewControllers.last {
return topViewController.preferredStatusBarStyle
}
return .default
}
}
并且如果您的viewController的样式将不同于应用程序的样式,则可以使它
var barStyle = UIStatusBarStyle.lightContent
override var preferredStatusBarStyle: UIStatusBarStyle{
return barStyle
}
让我们说您的应用状态样式为.default
,而您希望此屏幕为.lightContent
因此barStyle将采用.lightContent
作为其默认值,这会将状态栏样式更改为lightContent,然后确保当viewWillDisappear
再次将barStyle更改为应用程序状态栏样式时,本例中为.default
。
这对我有用
答案 31 :(得分:0)
swift4中用于特定视图控制器的基于导航的作品
let app = UIApplication.shared
let statusBarHeight: CGFloat = app.statusBarFrame.size.height
let statusbarView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: statusBarHeight))
statusbarView.backgroundColor = UIColor.red
view.addSubview(statusbarView)
答案 32 :(得分:0)
SWIFT 4.2 嘿,我想分享一个解决方案,该解决方案对我有用,是我从Graig Grummitt撰写的一篇关于这个难以捉摸的话题的出色文章中获得的。
步骤1 正如其他人提到的,将以下添加到您的PLIST
View controller-based status bar appearance YES
RootViewcontroller中的第2步在下面添加
var statusBarHidden: Bool = false {
didSet(newValue) {
UIView.animate(withDuration: 0.1) {
self.setNeedsStatusBarAppearanceUpdate()
}
}
}
override var prefersStatusBarHidden: Bool {
return statusBarHidden
}
var vcStatusBarStyle: UIStatusBarStyle = .default {
didSet(newValue) {
UIView.animate(withDuration: 0.1) {
self.setNeedsStatusBarAppearanceUpdate()
}
}
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return vcStatusbarStyle
}
更新属性statusBarHidden
或vcStatusBarStyle
时,它将调用setNeedsStatusBarAppearanceUpdate()
并使用prefersStatusBarHidden
或preferredStatusBarStyle
的新值更新状态栏。在我的情况下,我必须为容器viewcontroller更新这些属性,该属性是可见childviewcontroller的父级。我使用简单的委托方法完成了此任务。
protocol MainViewControllerDelegate {
func updateStatusBarStyle(statBarStayle: UIStatusBarStyle)
func toggleStatusBar(visable: Bool)
}
实例化childViewController(Visible VC)时,当然不要忘记将MainViewcontroller(Container VC)设置为其委托。我有时候会。 :)
childViewController.delegate = self
然后在childViewController中,当需要更新状态栏时,我刚刚调用了委托方法。
self.delegate?.updateStatusBarStyle(statBarStayle: .default)
如上所述,Graig Grummitt进一步详细介绍了此解决方案,并且还与UINavigationControllers一起使用。链接到这里:The Mysterious Case of the Status Bar
答案 33 :(得分:0)
单击Supporting Files组(左侧顶部 - 项目名称)。导航到信息。单击列表之间的某个位置,如下面的包名称。并添加“查看基于控制器的状态栏外观”并将其设置为NO。 然后打开AppDelegate.swift并像这样修改:
func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {
UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
return true
}
多数民众赞成。
答案 34 :(得分:0)
我自己也陷入了同样的问题。花了我4个多小时来搞清楚。我尝试了这里给出的所有答案,我得到的最好的是获得状态栏白色的标题。但是无论我做了什么,其他部分,如电池条和其他部分仍然是黑色的:关于应用此问题中提供的所有解决方案。所以我决定回溯我的步骤,并了解到我已经下载了一个CocoaPod依赖项,它改变了Xcode的正常功能和改变颜色的代码。对我来说,它是&#34; ChameleonFramework&#34;扶养。因此,如果您已经应用了所有解决方案并且没有为您工作,我建议您检查您从CocoaPods安装的依赖项,删除最新的依赖项。
答案 35 :(得分:-1)
答案 36 :(得分:-2)
Swift 4.0请在“didFinishLaunchingWithOptions launchOptions:”Appdelegate类中使用此代码
UIApplication.shared.statusBarStyle = .lightContent let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView if statusBar.responds(to: #selector(setter: UIView.backgroundColor)){ statusBar.backgroundColor = UIColor.black }
答案 37 :(得分:-2)
Swift 3
在AppDelegate
方法
func application
文件中
let statusBar: UIView = application.value(forKey: "statusBar") as! UIView
statusBar.backgroundColor = .red