最近在设置某些页面状态栏颜色的时候出现了属性不响应的问题
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?.rootViewControlle
r的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 }
作者:Bart_Simpson
链接:https://www.jianshu.com/p/395acc02234b
共同学习,写下你的评论
评论加载中...
作者其他优质文章