美文网首页
Swift状态栏修改(preferredStatusBarSty

Swift状态栏修改(preferredStatusBarSty

作者: YANGXIXIYear | 来源:发表于2019-02-28 11:12 被阅读0次

    一、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状态栏修改(preferredStatusBarSty

          本文链接:https://www.haomeiwen.com/subject/wmthuqtx.html