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

时间:2014-11-16 12:05:37

标签: swift uiviewcontroller ios8 xcode6 statusbar

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 的状态栏颜色?

38 个答案:

答案 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

  • 打开您的info.plist并设置 UIViewControllerBasedStatusBarAppearancefalse
  • AppDelegate.swift的第一个包含didFinishLaunchingWithOptions的函数中,设置所需的颜色。

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

  • Swift 3更新 *

    UIApplication.shared.statusBarStyle = .lightContent

答案 3 :(得分:17)

这里有十亿个答案,所以我想为什么不以扩展名的形式添加另一个(在@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

答案 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来组织我的视图控制器。我想更改所有状态栏样式。

您可以在下面看到。

enter image description here

Stars View Controller是CPBaseNavigationControllerCPBaseNavigationControllerUINavigationController的子类。

我尝试做下一个setps:

  1. AppDelegate.swift func didFinishLaunchingWithOptions中,添加

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

    但没有效果。

  2. 在StoryBoard中,找到Base Tab BarController(上图中的图片)。选择Attributes Inspector,将Sattus Bar属性更改为Light Content。这么糟糕,没效果

  3. enter image description here

    1. 最后我明白了。在我的自定义导航控件CPBaseNavigationController中,添加func preferredStatusBarStyle

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

      效果很好!

    2. 此外,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文件中添加以下密钥:

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

Screenshot 1

Screenshot 2

答案 19 :(得分:2)

我遇到这个问题。对于全局更改状态栏颜色在视图中确实显示并且然后将其更改回视图确实像已接受的答案一样消失时我感觉不太好。信不信由你可以通过覆盖所需视图控制器上的preferredStatusBarStyle来实现这一点。经过很长时间,这就是我所做的工作:

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

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

答案 20 :(得分:2)

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

  1. 如Apple文档所述,只需在viewDidLoad中调用setNeedsStatusBarAppearanceUpdate
  2.   

    如果视图控制器的状态栏属性(例如隐藏/取消隐藏状态或样式)发生更改,请调用此方法。如果在动画块中调用此方法,则会将更改与动画块的其余部分一起设置动画。

    1. 实施preferredStatusBarStyle返回您的首选类型。
    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

Info.plist

然后将下面的代码放置到要查看浅色内容的特定视图控制器(要查看深色文本,请将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)

如果有人想更改状态栏的电池和文本颜色,如下图所示:

enter image description here

您可以在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)

状态栏的自定义颜色(iOS11 +,Swift4 +)

如果您正在寻找一种解决方案,如何将状态栏更改为自定义颜色,这是可行的解决方案。

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
    }

更新属性statusBarHiddenvcStatusBarStyle时,它将调用setNeedsStatusBarAppearanceUpdate()并使用prefersStatusBarHiddenpreferredStatusBarStyle的新值更新状态栏。在我的情况下,我必须为容器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)

截至2020年10月,Swift 5,Xcode 12

如果要将其设置为应用程序中的所有视图控制器。以及您的应用是否具有导航控制器。

您可以在plist文件中执行以下操作: plist file changes

答案 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