如何在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@DoughnutMannavigationController?.navigationBar.barStyle=.Default是否适合您?@Beau Nouvelle navigationController?.navigationBar.barStyle=.Default这将更改导航栏样式而不是状态栏样式。我相信在某些情况下,它也会更改状态栏。是的,但不是一直在工作,我不知道why@AlessandroLucarini你能试试这个然后回去报告吗navigationController?.navigationBar.barStyle=.Default
当VC未嵌入导航堆栈时,上述答案可能有效。@Beaunovelle我已通过重写childV解决了扩展navigationController的问题