Swift 修改状态栏

一、过去修改状态栏样式是通过添加 Info.plist 属性来修改:

1、在Info.plist中设置 View controller-based status bar appearanceNO

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 中预先设置好,以免开启应用时有过渡的效果。

Swift 修改状态栏_第1张图片


三、关于动态修改状态栏

有时我们需要动态的修改状态栏是否隐藏 或者 更改状态栏样式。这时,可以自定义变量来记录状态。
例如:

    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的时候,被presentVCpreferredStatusBarStyle不会工作,你必须在present前设置:

vc.modalPresentationCapturesStatusBarAppearance = true

你可能感兴趣的:(Swift 修改状态栏)