如何在swift 2/iOS 9中正确更改状态栏样式?

如何在swift 2/iOS 9中正确更改状态栏样式?,ios,swift,statusbar,Ios,Swift,Statusbar,我正试图将状态栏的样式更改为.Light,但我在swift 1.2中实现的先前代码似乎不再有效。。代码如下: override func viewDidLoad() { super.viewDidLoad() UIApplication.sharedApplication().statusBarStyle = .LightContent } 现在,我的视图基于控制器的状态栏外观info.plist设置为“是”,并读取UIKit文档,这将否定任何sta

我正试图将状态栏的样式更改为
.Light
,但我在swift 1.2中实现的先前代码似乎不再有效。。代码如下:

override func viewDidLoad() {
        super.viewDidLoad()

        UIApplication.sharedApplication().statusBarStyle = .LightContent

    }
现在,我的
视图基于控制器的状态栏外观
info.plist设置为“是”,并读取UIKit文档,这将否定任何statusBarStyle更改,并将其保留为默认值。但是,当我将设置更改为“否”并更改statusBarStyle时,会得到以下信息:CGContextSaveGState:无效上下文0x0。如果要查看回溯,请在我的调试器中设置CG_CONTEXT_SHOW_backtrace环境变量。。这是Xcode中的一个bug吗?因为要更改状态栏样式,您必须将info.plist设置更改为NO,但如果发生此情况。。错误

我总是这样做

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
文件中的
视图基于控制器的状态栏外观设置为
YES

,这看起来像是Xcode 7.0中的一个bug。我还获得了
错误>:CGContextSaveGState:无效上下文0x0。
设置
查看基于控制器的状态栏外观时出错

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

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

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

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

override func  preferredStatusBarStyle() -> UIStatusBarStyle {

    return UIStatusBarStyle.LightContent
}

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

您也可以将其添加到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
}

苹果公司增加了在部署信息中更改状态栏样式的功能。只需选择“光”

还可以在
Info.plist中将
查看基于控制器的状态栏外观
键设置为
NO


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

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

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


只需确保在调用
preferredStatusBarStyle()
后也调用了
SetNeedssStatusBarAppearanceUpdate()
,以通知IOS有关此问题的信息。

在这里尝试一下,它可能会对您有所帮助

首先转到info.plist文件,并将此“基于视图控制器的状态栏外观”添加为键,并将该值设置为否

如下图所示

在此之后,转到AppDelegate.swift文件,并通过此
UIApplication.sharedApplication().statusBarStyle=UIStatusBarStyle.LightContent中的代码行

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool{
 UIApplication.sharedApplication().statusBarStyle =   UIStatusBarStyle.LightContent
 return true
}

如下图所示,swift 3覆盖preferredStatusBarStyle变量使用以下方法:

 override var preferredStatusBarStyle: UIStatusBarStyle{
    return .lightContent
}

Swift 3只需在
info.plist
中添加
View controller-based状态栏外观
NO
值,然后添加到
ViewController
中所需的位置:

UIApplication.shared.statusBarStyle = UIStatusBarStyle.lightContent

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

override var
现在,如果有人感到困惑,请不要使用
override func
——要点仍然相同,您仍然需要更改“Info.plist”:

override var preferredStatusBarStyle: UIStatusBarStyle 
{    
    //LightContent
    return UIStatusBarStyle.lightContent

    //Default
    //return UIStatusBarStyle.default
}

如果内容已更改,因此需要以编程方式更改同一视图控制器的状态栏,则此操作无效。如果使用此方法,请确保在info.plist文件中设置标志,以使基于视图控制器的状态栏标志为yes@real19是的,为我工作。只是为了给初学者澄清一下。为此,只需在Info.plist文件中添加一个名为“基于视图控制器的状态栏外观”的属性(Xcode将自动完成属性名称,并自动识别它是布尔值),然后将该属性设置为“是”。这将使状态栏具有“轻内容”效果。如果我想手动或根据上下文更改它,该怎么办?我有一个下拉通知,当这个下拉出现时,我想改变状态栏的颜色。有可能吗?在视图控制器中实现上述建议方法后,我现在可以随意更改状态栏样式,然后从代码中的同一控制器调用
self.setNeedsStatusBarAppearanceUpdate()
。preferredStatusBarStyle()检查UI是否使用深色或浅色主题,并基本上返回状态栏的相反样式。太好了,这对我来说没有改变,XCode 7,iOS 9.2请注意,只有在
Info.plist
中将
查看基于控制器的状态栏外观
键设置为
NO
时,此选项才有效。如果在项目设置中的“状态栏样式”中选择“灯光”,则它应自动将此键添加到Info.plist文件中。它应该这样做,但似乎不起作用。我必须设置Info.plist键,然后它就工作了。当有导航栏时它就不工作了。它只在没有it@DoughnutMan
navigationController?.navigationBar.barStyle=.Default是否适合您?@Beau Nouvelle navigationController?.navigationBar.barStyle=.Default这将更改导航栏样式而不是状态栏样式。我相信在某些情况下,它也会更改状态栏。是的,但不是一直在工作,我不知道why@AlessandroLucarini你能试试这个然后回去报告吗
navigationController?.navigationBar.barStyle=.Default
当VC未嵌入导航堆栈时,上述答案可能有效。@Beaunovelle我已通过重写
childV解决了扩展navigationController的问题