Swift状态栏修改(preferredStatusBarStyle不执行)

一、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
    }

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