【问题标题】:how do I properly change my status bar style in swift 2/ iOS 9?如何在 swift 2/iOS 9 中正确更改状态栏样式?
【发布时间】:2015-12-16 22:03:34
【问题描述】:

我正在尝试将状态栏的样式更改为.Light,但我在 swift 1.2 中实现的之前的代码似乎不再工作了。这是代码:

override func viewDidLoad() {
        super.viewDidLoad()

        UIApplication.sharedApplication().statusBarStyle = .LightContent

    }

现在我将View controller-based status bar appearance info.plist 设置为“是”,并阅读 UIKit 文档,这将否定任何 statusBarStyle 更改并将其保持为默认值。但是,当我将设置更改为“否”并更改 statusBarStyle 时,我在调试器中得到了这个<Error>: CGContextSaveGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable。那么这是 Xcode 中的错误吗?因为要更改状态栏样式,您必须将 info.plist 设置更改为 NO,但是当这种情况发生时.. 错误

【问题讨论】:

    标签: ios swift statusbar


    【解决方案1】:

    Apple 已添加更改部署信息中状态栏样式的功能。只需选择“Light”即可。

    还将View controller-based status bar appearance 键设置为NO 中的Info.plist

    【讨论】:

    • 这对我来说并没有改变,XCode 7,iOS 9.2
    • 请注意,这只有在Info.plist 中将View controller-based status bar appearance 键设置为NO 时才有效
    • 如果您在项目设置中的“状态栏样式”中选择 Light,那么它应该会自动在 Info.plist 文件中添加此键。
    • 应该是这样,但它似乎并没有那样工作。我必须设置 Info.plist 键,然后它才能工作。
    【解决方案2】:

    我一直都是这样。

    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
        }
    
        //Changing Status Bar
        override func preferredStatusBarStyle() -> UIStatusBarStyle {
    
            //LightContent
            return UIStatusBarStyle.LightContent
    
            //Default
            //return UIStatusBarStyle.Default
        }
    }
    

    它适用于任何 swift 2.x 版本。这要求您将Info.plist 文件中的View controller-based status bar appearance 设置为YES

    【讨论】:

    • 如果您使用这种方法,请确保您在 info.plist 文件中设置标志以使基于视图控制器的状态栏标志为 yes
    • @real19 是的,为我工作。只是为了为初学者清理东西。为此,只需在 Info.plist 文件中添加一个属性,名为“View controller-based status bar appearance”(Xcode 将自动完成属性名称,并自动识别它是一个布尔值),并将该属性设置为“是的”。这将使状态栏具有“轻内容”的效果。
    • 如果我想手动更改或根据上下文进行更改怎么办?我有一个下拉通知,当这个下拉菜单出现时,我想更改状态栏颜色。有可能吗?
    • 在视图控制器中实现上述建议的方法后,我现在可以随意更改状态栏样式,然后在代码中的任何位置从同一控制器调用self.setNeedsStatusBarAppearanceUpdate()。 preferredStatusBarStyle() 检查 UI 是否使用深色或浅色主题,并基本上为状态栏返回相反的样式。完美。
    【解决方案3】:

    Swift 3 只需将带有值 NOView controller-based status bar appearance 添加到 info.plist,然后在您想要的位置添加到 ViewController

    UIApplication.shared.statusBarStyle = UIStatusBarStyle.lightContent
    

    【讨论】:

    • 在 iOS 10 中,覆盖 preferredStatusBarStyle 似乎还不够。需要使用 UIApplication.shared.statusBarStyle 声明
    【解决方案4】:

    你仍然可以在你的视图控制器中使用preferredStatusBarStyle

    第 1 步:在 info.plist 中将 ViewControllerBasedStatusBarAppearance 设置为 YES。 第 2 步:将此代码添加到您要编辑的 ViewController 中:

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

    *** 提示:它似乎只能在 ViewDidLoad()、didReceiveMemoryWarning() 函数之外工作。

    【讨论】:

      【解决方案5】:

      部署信息的更改有效,但尽管如此 - 您需要添加 '查看基于控制器的状态栏外观'键将 plist 文件设置为 NO。

      【讨论】:

        【解决方案6】:

        您也可以在 AppDelegate 中添加它。如果您想为应用程序中的每个 ViewController 更改此选项,而不必为每个其他 VC 设置不同,则此选项会更好。

        func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
            application.statusBarStyle = UIStatusBarStyle.LightContent
            // instead of 
            // UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: false)
            // which gives warning about deprecation in iOS 9
        
            return true
        }
        

        【讨论】:

          【解决方案7】:

          看起来这是 Xcode 7.0 中的一个错误。设置View controller-based status bar appearance 时,我也收到Error>: CGContextSaveGState: invalid context 0x0. 错误

          现在我只是覆盖每个视图控制器中的状态栏颜色。

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

          【讨论】:

          • 如果内容发生更改,这将无济于事,因此需要以编程方式更改同一视图控制器的状态栏。
          【解决方案8】:

          您可以在部署信息中选择“轻”,但您还需要添加“基于控制器的状态栏外观”并将其设置为否。

          【讨论】:

            【解决方案9】:

            试试这个可能对你有帮助

            首先转到 info.plist 文件并添加这个“基于控制器的状态栏外观”作为键并将值设置为 NO

            如下图所示

            在此之后来到 AppDelegate.swift 文件并在

            中通过这 UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent 行代码
            func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool{
             UIApplication.sharedApplication().statusBarStyle =   UIStatusBarStyle.LightContent
             return true
            }
            

            喜欢这个

            【讨论】:

            • 有导航栏的时候就不行了。它只有在没有它的情况下才能工作
            • @DoughnutMan navigationController?.navigationBar.barStyle = .Default 对你有用吗?
            • @Beau Nouvelle navigationController?.navigationBar.barStyle = .Default 这将更改导航栏样式而不是状态栏样式。
            • 我相信这也会在某些情况下改变状态栏。
            【解决方案10】:

            对于 swift 3 覆盖preferredStatusBarStyle 变量使用这个:

             override var preferredStatusBarStyle: UIStatusBarStyle{
                return .lightContent
            }
            

            【讨论】:

            • 是的,但它并不总是有效,我不知道为什么
            • @AlessandroLucarini 你能试试这个并报告吗? navigationController?.navigationBar.barStyle = .Default 当 VC 未嵌入导航堆栈时,上述答案可能有效。
            • @BeauNouvelle 我已经解决了扩展 NavigationController 的问题,当我的控制器嵌入导航控制器时覆盖 childViewControllerForStatusBarStyle 并在 vc 以模态方式呈现时设置 modalPresentationCapturesStatusBarAppearance
            • 让这个工作起来真是太麻烦了。我对一些遗留代码有类似的问题。我需要进行血仪式才能让这些东西发挥作用。它实际上应该只是一行代码。苹果....
            【解决方案11】:

            现有的答案很棒,但现在有了新的更新,它有点不同了!

            现在override var 而不是override func 对于任何困惑的人 - 要点仍然相同,您仍然需要更改“Info.plist”:

            override var preferredStatusBarStyle: UIStatusBarStyle 
            {    
                //LightContent
                return UIStatusBarStyle.lightContent
            
                //Default
                //return UIStatusBarStyle.default
            }
            

            【讨论】:

              【解决方案12】:

              如果您想在您的应用程序中不时更改它,您可以使用前面提到的覆盖preferredStatusBarStyle()

              请确保您在拨打preferredStatusBarStyle() 后也拨打setNeedsStatusBarAppearanceUpdate() 通知IOS。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2016-08-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-09-26
                • 1970-01-01
                相关资源
                最近更新 更多