首页 文章

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

提问于
浏览
153
override func preferredStatusBarStyle() -> UIStatusBarStyle {
 return UIStatusBarStyle.LightContent;
}

在任何ViewController中使用上面的代码,为特定的viewcontroller doesnt work in iOS8 for me 将statusBar颜色设置为White . 有什么建议?使用UIApplication.sharedApplication方法,在整个应用程序的Info.plist中所需的更改之后,颜色会发生变化 .

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

如何更改某些所需的状态栏颜色和 specific ViewControllers

28 回答

  • -2

    SWIFT 2

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

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

    在阅读了所有建议并尝试了一些内容之后,我可以使用以下步骤将其用于特定的viewcontrollers:

    First Step:

    打开info.plist并插入名为“查看基于控制器的状态栏外观”的新密钥到 NO

    Second Step (Just an explanation, no need to implement this):

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

    Swift 2

    UIApplication.sharedApplication().statusBarStyle = .LightContent
    

    Swift 3

    UIApplication.shared.statusBarStyle = .lightContent
    

    但这会影响所有ViewControllers的 statusBarStyle .

    So, how to get this working for specific ViewControllers - Final Step:

    打开要更改 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 的新定义值

  • 0

    (截至2019年3月14日)

    Swift 4Swift 4.2

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.setNeedsStatusBarAppearanceUpdate()
    }
    override var preferredStatusBarStyle : UIStatusBarStyle {
        return .lightContent
    }
    
  • 3

    我按照本教程,它对我有用 . 但是,我不确定是否有任何警告 .

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

    • 打开info.plist并将 UIViewControllerBasedStatusBarAppearance 设置为 false .

    • AppDelegate.swift 的第一个函数中,包含 didFinishLaunchingWithOptions ,设置所需的颜色 .

    UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

    • Swift 3 Update *

    UIApplication.shared.statusBarStyle = .lightContent

  • 6

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

    如果将其定义为YES,则应在每个视图控制器中覆盖preferredStatusBarStyle函数 .

    如果您将其定义为NO,则可以使用AppDelegate设置样式

    UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
    
  • 7

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

    斯威夫特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
    
  • 24
    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()
        }
    
    }
    
  • 1

    Swift 3

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

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

  • 0

    Swift 4.2 solution with NavigationController

    First Step:

    打开info.plist并插入一个名为“View controller-based status bar appearance”或 UIViewControllerBasedStatusBarAppearance 的新密钥,让每个VC使用自己的status属性 .

    Second Step

    在每个VC中,覆盖preferredStatusBarStyle属性,如下所示:

    override var preferredStatusBarStyle : UIStatusBarStyle {
        return .lightContent //.default for black style
    }
    

    Last step

    覆盖自定义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
    }
    
  • 327

    对于斯威夫特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
        }
    
  • 61

    如上所述实现 preferredStatusBarStyle 并在 ViewDidLoad 中调用 self.setNeedsStatusBarAppearanceUpdate() ,并在Info.plist中将 UIViewControllerBasedStatusBarAppearance 调用为 YES (默认情况下为 YES

    目前尚不清楚为什么它不工作 . 我需要检查代码 . 另一个建议是使用 viewDidLoad UIApplication.sharedApplication().statusBarStyle = .LightContent 中的工作代码,并在查看get消失 viewWillDisappear 时将其更改为默认值 .

  • 1

    在我的情况下,我使用故事板来组织我的视图控制器 . 我想更改所有状态栏样式 .

    你可以在下面看到 .

    enter image description here

    Stars View Controller是 CPBaseNavigationControllerCPBaseNavigationControllerUINavigationController 的子类 .

    我尝试做下一个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 . 糟糕,没有效果 .

    enter image description here

    • 最后我明白了 . 在我的自定义导航控制器 CPBaseNavigationController 中,添加功能 preferredStatusBarStyle
    override func preferredStatusBarStyle() -> UIStatusBarStyle {
       return .LightContent
    }
    

    它运作良好!

    Besides,statusBarStyle deprecated in 9.0,you can use -[UIViewController preferredStatusBarStyle].

  • 2

    适用于导航应用

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

    在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)
    
  • 15

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

    Swift 4 对于没有使用navigationViewController嵌入的特定ViewController,只需将其添加到ViewController文件中即可 .

    override var preferredStatusBarStyle : UIStatusBarStyle {
        return .lightContent
    }
    
  • 6

    我使用 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 文件中添加以下键:

    View controller-based status bar appearance ,布尔值设置为 NO

    Screenshot 1

    Screenshot 2

  • 2

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

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

    它在iOS 10.1中适用于我 .

    Objective C

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

    Swift

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

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

  • 13

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

    • info.plist 中基于控制器的状态栏外观更改为YES .

    • 现在,任何全屏视图控制器都可以通过覆盖 preferredStatusBarStyle 来更改状态栏样式 .

    • 我指定全屏,因为这对于(非全屏)模态视图控制器不起作用,而不是将 modalPresentationCapturesStatusBarAppearance 设置为是 .

    • 此外,如果你有嵌入式视图控制器,例如在导航控制器中,它会向最顶层的视图控制器询问状态栏样式 . 覆盖 childViewControllerForStatusBarStyle 并传递嵌入式视图控制器应该可以工作,但它不适合我 . 所以我只是将嵌入式视图控制器首选状态栏作为首选状态栏样式返回 . 像这样的东西:

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

    Swift 3.0更新

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

    在Storyboard中,对我有用的是导航控制器,选择导航栏,单击属性检查器,然后将样式从默认更改为黑色 . 而已!

  • 11

    另一个非常简单的方法就是创建UINavigationController类的扩展 .

    由于覆盖 preferredStatusBarStyle: 方法不能正常工作 UNLESS 我们在UINavigationController类中执行此操作 .

    extension UINavigationController {
    open override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
    

    }

  • 11

    单击Supporting Files组(左侧顶部 - 项目名称) . 导航到信息 . 单击列表之间的某个位置,如下面的包名称 . 并添加“查看基于控制器的状态栏外观”并将其设置为NO . 然后打开AppDelegate.swift并像这样修改:

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

    而已 .

  • 6

    我文学上也遇到了同样的问题 . 花了我4个多小时来搞清楚 . 我尝试了这里给出的所有答案,我得到的最好的是获得状态栏白色的 Headers . 但是无论我做了什么,其他部分,如电池条和其他部分仍然是黑色的:关于应用此问题中提供的所有解决方案 . 所以我决定回溯我的步骤,并了解到我已经下载了一个CocoaPod依赖项,它改变了Xcode的正常功能和改变颜色的代码 . 对我来说,这是“ChameleonFramework”的依赖性 . 因此,如果您已应用所有解决方案并且不适合您,我建议您检查您从CocoaPods安装的依赖项,删除最新的依赖项 .

  • 1

    对于Xcode 10,您可以创建一个类并将其放在您的viewController类之前,您可以在所有视图控制器中调用此类,需要一个轻量级状态栏...

    class UIViewControllerWithLightStatusBar: UIViewController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
    return UIStatusBarStyle.lightContent
    }
    }
    

    现在更改viewController类:

    class YourViewController: UIViewControllerWithLightStatusBar {
    ...
    }
    

    就这样...

  • -2

    SWIFT 4.2 嘿,我想分享一个解决方案,这对我来说很有用,我是从Graig Grummitt的一篇关于这个特殊主题的文章中得到的 .

    步骤1正如其他人在您的PLIST中提到的ADD

    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的这些属性,这是visable的父级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

  • 8

    Swift 3

    AppDelegate 文件里面 func application 方法

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

    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 }
    

相关问题