在iOS8中使用Swift更改特定ViewController的状态栏颜色

override func preferredStatusBarStyle() -> UIStatusBarStyle { return UIStatusBarStyle.LightContent; } 

在任何ViewController中使用上面的代码来设置statusBar颜色为白色的特定的viewcontroller 不适用于我的iOS8 。 有什么build议么? 使用UIApplication.sharedApplication方法,在整个应用程序的Info.plist中进行所需更改后,颜色会发生变化。

 // Change the colour of status bar from black to white UIApplication.sharedApplication().statusBarStyle = .LightContent 

我如何才能更改状态栏颜色的一些必需和特定的ViewControllers

读完所有的build议,并尝试了一些事情,我可以得到这个工作的具体viewcontrollers使用以下步骤:

第一步:

打开你的info.plist并将一个名为“ View controller-based status bar appearance ”的新密钥插入到NO

第二步(只是一个解释,不需要执行此操作):

通常我们把下面的代码放在AppDelegate的应用程序(_:didFinishLaunchingWithOptions :)方法中,

Swift 2

 UIApplication.sharedApplication().statusBarStyle = .LightContent 

Swift 3

 UIApplication.shared.statusBarStyle = .lightContent 

但是会影响所有ViewController的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

(截至2017年7月13日)

Swift 3Swift 3.1

 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) UIApplication.shared.statusBarStyle = .lightContent } override var preferredStatusBarStyle : UIStatusBarStyle { return .lightContent } 

我遵循这个教程,它为我工作。 但是,我不确定是否有任何警告。

https://coderwall.com/p/dyqrfa/customize-navigation-bar-appearance-with-swift

  • 打开你的info.plist并将UIViewControllerBasedStatusBarAppearance设置为false
  • AppDelegate.swift的第一个函数中,它包含didFinishLaunchingWithOptions ,设置你想要的颜色。

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

在您的Info.plist中,您需要将基于视图控制器的状态栏外观定义为任何值。

如果将其定义为YES,则应该在每个视图控制器中重写preferredStatusBarStyle函数。

如果你定义它,那么你可以使用AppDelegate设置样式

 UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true) 
 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() } } 

Swift 3

 let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView if statusBar.responds(to: #selector(setter: UIView.backgroundColor)) { statusBar.backgroundColor = UIColor.black } 

这是为特定的视图控制器设置状态栏的背景颜色的解决scheme。

SWIFT 2

我能够通过在我的viewWillAppear中添加以下内容来成功更改状态栏背景的外观:

 let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView if statusBar.respondsToSelector(Selector("setBackgroundColor:")) { statusBar.backgroundColor = .redColor() } 

像上面提到的那样实现preferredStatusBarStyle ,并在ViewDidLoad调用self.setNeedsStatusBarAppearanceUpdate() ,在Info.plist中也将UIViewControllerBasedStatusBarAppearance设置为YES (默认为YES

不清楚为什么它不工作。我需要检查code.One其他build议是与工作代码在viewDidLoad UIApplication.sharedApplication().statusBarStyle = .LightContent并将其更改为默认当您查看get消失viewWillDisappear

在我的情况下,我使用故事板来组织我的视图controllers.I想改变所有的状态栏风格。

你可以看到下面的图片。

在这里输入图像说明

Stars View Controller是一个CPBaseNavigationControllerCPBaseNavigationControllerUINavigationController子类。

我试着做下一步:

  1. AppDelegate.swift func didFinishLaunchingWithOptions ,添加

     //change status bar color UIApplication.sharedApplication().statusBarHidden = false UIApplication.sharedApplication().statusBarStyle = .LightContent 

    但没有效果。

  2. 在StoryBoard中,findBase Tab BarControllerBase Tab BarController图片)。selectAttributes Inspector ,将Sattus Bar属性更改为Light Content 。所以不好,不起作用。

在这里输入图像说明

  1. 最后我得到它。在我的自定义导航控制器CPBaseNavigationController ,添加func preferredStatusBarStyle

     override func preferredStatusBarStyle() -> UIStatusBarStyle { return .LightContent } 

    它运作良好!

另外,在9.0中不推荐使用statusBarStyle ,你可以使用-[UIViewController preferredStatusBarStyle]

这里有十亿个答案,所以我想为什么不以扩展的forms添加另一个(在@Cœur的帮助下)

Swift 3

延期:

 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 

适用于基于导航的应用

  var addStatusBar = UIView() addStatusBar.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 20); addStatusBar.backgroundColor = global().UIColorFromRGB(0x65b4d9) self.window?.rootViewController?.view .addSubview(addStatusBar) 

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 } } 

在Swift 3.0 Xcode 8中,所有东西都容易得多

在App Delegate文件中使用下面的代码

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

插入这个:

 UINavigationBar.appearance().barStyle = .black UINavigationBar.appearance().barTintColor = UIColor(red: 230, green: 32, blue: 31, alpha: 1.0) 

我在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文件中添加下面的键:

查看基于控制器的状态栏外观 ,布尔值设置为NO

截图1

截图2

为迅速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 } 

我可以build议你一个更简单的方法,

  1. 只要在viewDidLoad中调用setNeedsStatusBarAppearanceUpdate ,就像苹果文档所说的那样,

如果视图控制器的状态栏属性(如隐藏/未隐藏状态或样式)发生更改,请调用此方法。 如果您在animation块中调用此方法,则会随着animation块的其余部分一起animation更改。

  1. 实现preferredStatusBarStyle返回您的首选types。

它在iOS 10.1中为我工作。

目标C

 [self setNeedsStatusBarAppearanceUpdate]; -(UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } 

迅速

 setNeedsStatusBarAppearanceUpdate() var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } 

我很惊讶没有人指出这一点。 无论如何享受:)

Swift 3.0更新

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { UIApplication.shared.statusBarStyle = .lightContent return true } 

我遇到了这个问题 我并没有真正感觉到全局改变状态栏的颜色在视图中确实出现,然后在视图上改变它就像接受的答案一样消失。 相信与否你可以通过在你想要的视图控制器上覆盖preferredStatusBarStyle来获得这个工作。 经过很多时间,这是我所做的工作:

  1. 将您的info.plist基于视图控制器的状态栏外观更改为YES。
  2. 现在,任何全屏视图控制器都可以通过覆盖preferredStatusBarStyle来更改状态栏样式。
  3. 我指定全屏幕,因为这不适用于(非全屏幕)模式视图控制器,而不是没有设置modal​Presentation​Captures​Status​Bar​Appearance为是。
  4. 另外,如果你有embedded的视图控制器,例如在导航控制器中,它会询问最顶层的视图控制器的状态栏样式。 覆盖child​View​Controller​For​Status​Bar​Style和传递embedded视图控制器应该工作,但它不适合我。 所以我刚刚返回embedded视图控制器首选状态栏作为首选的状态栏风格。 像这样的东西:

     override var preferredStatusBarStyle: UIStatusBarStyle { if let topViewController = viewControllers.last { return topViewController.preferredStatusBarStyle } return .default } 

点击支持文件组(您的项目的左上angular名称)。 导航到信息。 点击列表之间的某处,如下面的包名称。 并添加“查看基于控制器的状态栏出现”并将其设置为NO。 然后打开AppDelegate.swift并像这样修改:

 func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool { UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true) return true } 

而已。

我文学上也涉及到这个问题。 花了我4个多小时弄清楚了。 我试着在这里给出的所有答案,我得到的最好的是到标题状态栏白色。 但是不pipe我做了什么,其他一些东西,比如电池条等,仍然是黑色的:关于应用这个问题提供的所有解决scheme。 所以我决定回溯我的步骤,并了解到我已经下载了一个CocoaPod依赖项,它正在改变Xcode的正常function和改变颜色的代码。 对我来说,这是“变色龙框架”的依赖。 所以我build议你检查你从CocoaPods安装的依赖关系,如果你已经应用了所有的解决scheme并且没有为你工作,删除最新的依赖关系。

Swift 3.0:

 UIApplication.shared.statusBarStyle = .lightContent 

在Storyboard中,与我共事的是导航控制器,select导航栏,点击属性检查器,然后将样式从默认改为黑色。 而已!

Swift 3

在你的AppDelegate文件里面有func application方法

 let statusBar: UIView = application.value(forKey: "statusBar") as! UIView statusBar.backgroundColor = .red 

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 }