美文网首页
关于 Swift 中重写 preferredStatusBarS

关于 Swift 中重写 preferredStatusBarS

作者: Alan张洋 | 来源:发表于2018-09-15 15:57 被阅读140次

    前言:本次使用的 Swift 版本为 4.2 版本,所以代码上与之前版本的写法会有不一样的地方, 但思路都如此。那我就根据自己的项目简单说下解决办法, 又更好办法的, 也请大牛留言探讨, O(∩_∩)O谢谢!

    分析:
    • iOS9 之前使用 UIApplication.shared.statusBarStyle = .lightContent 可以更改状态栏的前景颜色, 但也改变了全局的, 所以在 iOS9 之后苹果推荐使用 preferredStatusBarStyle 在对应的 UIViewController 中灵活改变状态栏前景色, 但总会遇到重写完了不管用的结果, 也是让人很郁闷。
    步骤:
    • 首先需要在项目 targets 中的 info.plist 文件中将 View controller-based status bar appearance 设置为 NO;
    • 如果UIViewController是存在于自定义的UINavigationController中,需要在自定义的UINavigationController中重写childForStatusBarHiddenchildForStatusBarStyle两个方法:
    为什么要重写这个东西呢?
    因为这两个方法默认返回值是nil

    也就是当我们调用setNeedsStatusBarAppearanceUpdate的时候,系统会调用Container(容器控制器)的preferredStatusBarStyle这个方法(window?.rootViewControllerpreferred的方法,一般我们用UINavigationController或者UITabBarController来做Container),也就是根本不会调用子控制器(我们所看到的UIViewcontroller)的preferredStatusBarStyle方法。
    这个时候childForStatusBarHiddenchildForStatusBarStyle两个方法就派上用场了。

    // 重写这两个方法
    override var childForStatusBarHidden: UIViewController? {
        return self.topViewController
    }
    
    override var childForStatusBarStyle: UIViewController? {
        return self.topViewController
    }
    
    • 最后在需要改变状态栏颜色的UIViewController中重写preferredStatusBarStyle方法:
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
    

    相关文章

      网友评论

          本文标题:关于 Swift 中重写 preferredStatusBarS

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