美文网首页SwiftiOS学习开发Swift&Objective-C
Swift——preferredStatusBarStyle状态

Swift——preferredStatusBarStyle状态

作者: Bart_Simpson | 来源:发表于2018-11-02 11:15 被阅读0次

    最近在设置某些页面状态栏颜色的时候出现了属性不响应的问题

        override var preferredStatusBarStyle: UIStatusBarStyle {
            return .lightContent
        }
    

    依稀记得是直接重写preferredStatusBarStyle: UIStatusBarStyle这个属性,然后将info.plist中的View controller-based status bar appearance设置为NO


    但是这样设置之后发现还是不响应。
    环境相关:swift 4.2 , Xcode 10.0

    然后我就开始各种搜索和尝试,发现如果是自定义的UINavigationController,现在需要重写另外一个属性

    /// 重写此方法让 preferredStatusBarStyle 响应
        override var childForStatusBarStyle: UIViewController? {
            return self.topViewController
        }
    

    为什么要重写这个东西呢?
    因为这两个方法默认返回值是nil
    也就是当我们调用setNeedsStatusBarAppearanceUpdate的时候,系统会调用Container(容器控制器)的preferredStatusBarStyle这个方法(window?.rootViewController的preferred的方法,一般我们用UINavigationController或者UITabBarController来做Container),也就是根本不会调用子控制器(我们所看到的UIViewcontroller)的preferredStatusBarStyle方法。
    这个时候childForStatusBarHidden和childForStatusBarStyle两个方法就派上用场了。

    并且将info.plist中的View controller-based status bar appearance设置为YES


    然后设置状态栏的属性就可以响应了!

    基本看到的文章都是把另外一个属性也重写,关于隐藏的

       override var childForStatusBarHidden: UIViewController? {
           return self.topViewController
       }
    

    但是我测试了一下返现不用写,隐藏属性可以直接生效

        override var prefersStatusBarHidden: Bool {
            return true
        }
    

    看到说如果是有自定义UITabBarController的,需要重写这个属性。但是我没有尝试,放出来给个提醒好了

    override var childViewControllerForStatusBarStyle: UIViewController? {
        return self.selectedViewController
    }
    

    最后我尝试将info.plist中的View controller-based status bar appearance直接删掉,发现也是可以的,可能这个属性默认为YES。

    总结,敲黑板啦。如果想设置某个页面状态栏为白色

    1.重写状态栏样式
        override var childForStatusBarStyle: UIViewController? {
            return self.topViewController
        }
    
    2.在自定义的UINavigationController中重写此方法
        /// 重写此方法让 preferredStatusBarStyle 响应
        override var childForStatusBarStyle: UIViewController? {
            return self.topViewController
        }
    

    相关文章

      网友评论

        本文标题:Swift——preferredStatusBarStyle状态

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