• 让preferredStatusBarStyle真的工作(iOS 10以后)

    让preferredStatusBarStyle真的工作(iOS 10以后)

    作者:@nixzhu


    当你想将Status Bar上的文字改成白色,先(打开还没被GFW屏蔽的VPN)用Google搜索一下,然后开心地在某个UIViewController的子类里写下:

    1. class ViewController: UIViewController {
    2. override var preferredStatusBarStyle: UIStatusBarStyle {
    3. return .lightContent
    4. }
    5. }

    你满心欢喜地编译、运行,却发现上面的代码不工作。

    原因也很简单,你的VC很可能是被嵌入一个UINavigationController或者UITabBarController中

    系统会从windowrootViewController(通常是某个容器VC)开始确认preferredStatusBarStyle

    为了让这个确认可以传递下去,你需要子类化UINavigationControllerUITabBarController,并重载:

    1. class NavigationController: UINavigationController {
    2. override var childViewControllerForStatusBarStyle: UIViewController? {
    3. return visibleViewController
    4. }
    5. }
    6. class TabBarController: UITabBarController {
    7. override var childViewControllerForStatusBarStyle: UIViewController? {
    8. return selectedViewController
    9. }
    10. }

    这样系统会依据返回的VC的preferredStatusBarStyle来决定Status Bar的Style。当然,你要先使用子类化的UINavigationControllerUITabBarController来做此VC的容器。

    通常,这样就不会有问题了。不过,总是有一个例外。

    当你present一个VC的时候,被present的VC的preferredStatusBarStyle不会工作(尽管它会是visibleViewController)。你必须在present前设置:

    1. vc.modalPresentationStyle = .overCurrentContext // 如果你用的是自定义转场,modalPresentationStyle会不一样。
    2. vc.modalPresentationCapturesStatusBarAppearance = true

    这样“确认工作”才会继续传递下去。

    如果有必要,你还应该在合适的时机调用UIViewController的setNeedsStatusBarAppearanceUpdate()来强制更新preferredStatusBarStyle


    参考:UIViewController.preferredStatusBarStyle


    欢迎转载,但请一定注明出处! https://github.com/nixzhu/dev-blog