一、过去修改状态栏样式是通过添加 Info.plist 属性来修改:
1、在Info.plist
中设置 View controller-based status bar appearance
为 NO
2、在需要修改的控制器中
override func viewDidLoad() {
super.viewDidLoad()
UIApplication.shared.statusBarStyle = .lightContent
}
如果需要在全部View
中都改变样式,可以写在父类的相关方法中,或者写到AppDelegate.swift
中。
二、现在修改状态栏的样式可以使用以下方法,更加简便,不用配置Info.plist
属性:
/// 状态栏样式
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
/// 状态栏是否隐藏
override var prefersStatusBarHidden: Bool {
return false
}
/// 状态栏的隐藏与显示动画样式
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
return .slide
}
但是如果控制器包装了一个
UINavigationController
,就会发现即使重写了preferredStatusBarStyle
属性,状态栏样式也没有做任何的改变。
这是需要重写
UINavigationController
的以下2个方法,来让系统调用当前控制器的preferredStatusBarStyle
属性。
extension UINavigationController {
open override var childViewControllerForStatusBarStyle: UIViewController? {
return viewControllers.last
}
open override var childViewControllerForStatusBarHidden: UIViewController? {
return viewControllers.last
}
}
如果应用的第一页面就需要修改状态栏样式,建议在
Deployment Info -> Status Bar Style
中预先设置好,以免开启应用时有过渡的效果。
三、关于动态修改状态栏
有时我们需要动态的修改状态栏是否隐藏 或者 更改状态栏样式。这时,可以自定义变量来记录状态。
例如:
var isStatusBarHidden = false {
didSet {
/// 这里包装动画使得 preferredStatusBarUpdateAnimation 能体现效果
UIView.animate(withDuration: 0.3) {
self.setNeedsStatusBarAppearanceUpdate()
}
}
}
/// 状态栏是否隐藏
override var prefersStatusBarHidden: Bool {
return isStatusBarHidden
}
/// 状态栏的隐藏与显示动画样式
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
return .slide
}
/// 隐藏或显示状态栏
@IBAction func changeStatusBar(_ sender: UIButton) {
isStatusBarHidden = !isStatusBarHidden
}
⚠️ 当你present
一个VC
的时候,被present
的VC
的preferredStatusBarStyle
不会工作,你必须在present
前设置:
vc.modalPresentationCapturesStatusBarAppearance = true