一、iOS9之前,全局修改状态栏步骤:
1、在项目的Info.plist中添加字段View controller-based status bar appearance,并设置为NO;
2、使用UIApplication.shared.statusBarStyle和UIApplication.shared.isStatusBarHidden来修改状态栏的颜色和隐藏与否;
通常代码如下(此处统一在viewWillAppear和viewWillDisappear做说明,可根据需求做响应修改):
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
UIApplication.shared.statusBarStyle = .lightContent
UIApplication.shared.isStatusBarHidden = true
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
UIApplication.shared.statusBarStyle = .default
UIApplication.shared.isStatusBarHidden = false
}
上述方法在iOS9的时候被废弃了,苹果推荐方法如下。。。
二、 使用preferredStatusBarStyle和prefersStatusBarHidden实现:
1、在项目的Info.plist中添加字段View controller-based status bar appearance,并设置为YES;
2、在需要修改的控制器中重写下面方法:
override var preferredStatusBarStyle: UIStatusBarStyle {
/** 目前只有两种颜色可选
* .default 黑色
* .lightContent 白色
*/
return .lightContent
}
override var prefersStatusBarHidden: Bool {
return true
}
如果需要动态修改状态栏隐藏与否,则可以添加一个变量,在set方法的时候调用setNeedsStatusBarAppearanceUpdate
var ifStatusBarHidden = true {
didSet {
setNeedsStatusBarAppearanceUpdate()
}
}
在需要修改的地方直接给ifStatusBarHidden赋值,然后在prefersStatusBarHidden中直接返回ifStatusBarHidden
有些时候上述第二种方法所有设置完不起作用,即程序没有走preferred方法,那是因为当我们调用setNeedsStatusBarAppearanceUpdate时,系统会调用容器控制器即根视图的preferred方法,一般我们用UINavigationController或UITabBarController做根视图容器时,系统根本就不会调用子视图控制器(UIViewController)方法,我的解决办法是,自定义一个导航控制器,重写下面方法:
override var childForStatusBarStyle: UIViewController? { // 状态栏颜色
return self.topViewController
}
override var childForStatusBarHidden: UIViewController? { // 状态栏隐藏与否
return self.topViewController
}
网友评论