一、全局更改状态栏颜色
以全局更改状态栏浅色风格为例
1、info.plist 中添加View controller-based status bar appearance 并设置为YES
2、在 AppDelegate.swift中,设置
UINavigationBar.appearance().barStyle = .black 即可 (如果不设置则默认为深色风格)
二、在个别页面设置不同的状态栏颜色
以大部分页面状态栏颜色为深色风格,某一个特殊页面需要浅色风格为例
1、info.plist 中添加View controller-based status bar appearance 并设置为NO
2、在 AppDelegate.swift中,设置
UINavigationBar.appearance().barStyle = .default
或者 UIApplication.shared.statusBarStyle = UIStatusBarStyle.default
3、在需要更改状态栏颜色的特殊页面
override func viewWillAppear(_animated:Bool) {
super.viewWillAppear(animated)
UIApplication.shared.statusBarStyle = UIStatusBarStyle.lightContent
}
override func viewWillDisappear(_animated:Bool) {
super.viewWillDisappear(animated)
UIApplication.shared.statusBarStyle = UIStatusBarStyle.default
}
最后说说如何使用preferredStatusBarStyle这个方法(支持iOS9.0以上)
1、info.plist 中 View controller-based status bar appearance 设置为NO
2、在需要更改的vc中重写
override var preferredStatusBarStyle: UIStatusBarStyle{
return .default or .lightContent
}
3.最关键的地方来了!!!需要在UINavigationController写一个Catogory,重写以下方法
- (UIViewController*)childViewControllerForStatusBarStyle {
return self.visibleViewController;
}
- (UIViewController*)childViewControllerForStatusBarHidden {
return self.visibleViewController;
}
为什么要重写这个东西呢?通过查阅相关资料得知,
这个方法默认返回值是nil。也就是当我们调用setNeedsStatusBarAppearanceUpdate的时候,系统会调用container(容器控制器)的preferredStatusBarStyle这个方法(app.window.rootViewController的preferred的方法,一般我们用UINavigationController或者UITabBarController来做container),也就是根本不会调用子控制器(我们所看到的UIViewcontroller)的preferredStatusBarStyle方法。这个时候- (UIViewController *)childViewControllerForStatusBarStyle:就派上用场了。
该类扩展的意思就是,我重写了,你不要调用Container(NavigationController或者UITabBarController)的preferredStatusBarStyle这个方法了,去调用self.visibleViewController的preferredStatusBarStyle,那么,我们写在UIViewcontroller里面的方法就会被调用了,就能更改StatusBar的前景颜色了
这样,只需要在桥接文件中引入该category,那么在全局vc中都可以通过重写preferredStatusBarStyle来更改状态栏颜色