iOS13 状态栏样式无效(从未调用过 childForStatusBarStyle)

iOS 13 Status bar style invalid (childForStatusBarStyle never called)

我搜索了很多,但没有在 Whosebug 或其他任何地方找到与我相同的问题。


设置


问题

自从iOS 13 发布以来,我的状态栏逻辑被破坏了,我不明白为什么。在 iOS <= 12.4 上一切正常。 childForStatusBarStyle 永远不会被调用,每个 viewController 都有一些随机样式 .

UPDATE:因为 iOS 13 已发布状态的样式基于 UserInterfaceStyle 全局设置,而不是基于 preferredStatusBarStyle(设置正确) 在 UITabBarController -> UINavigationController -> UIViewController 层次结构的情况下。


问题

问题是如何解决这个问题?在这个逻辑中是否有什么悄无声息地改变了? (检查了许多文章和变更日志)


复制

我已经能够重现示例项目中的错误,所有设置都如上所述。

Here 我有 github 项目,其中包含如下视图层次结构:

CustomTabBarController
 - UINavigationController
   - CustomViewController
 - CustomViewController

现在,当您 select 第一个标签应用有深色状态栏时,第二个 select 有浅色状态栏。 CustomViewController 已将 preferredStatusBarStyle 设置为 .lightContent

更多:


P.S: 我已经准备好并将提供有关该主题的更多详细信息,请随时向我提出要求。项目 运行 超过 2 年,这样的事情真的要调试 :)

在导航控制器的情况下,状态栏样式 (light/dark) 不依赖于,也从来没有依赖于导航栏样式以外的任何东西。在项目的自定义标签栏中添加此行:

    let bugVC = UINavigationController(rootViewController: ViewController())
    bugVC.navigationBar.barStyle = .black // *

现在状态栏文本在标签栏控制器的两个子项中都是白色的。 (如果您不喜欢导航栏的颜色,默认为黑色,您可以更改它;这不会影响状态栏的行为。)

对于那些在时间上使用 .barStyle 很重要的人来说,有一个解决方法。子类UINavigationController,然后每次viewControllers变化时调用setNeedsStatusBarAppearanceUpdate


示例代码

class WorkaroundNavigationController: UINavigationController {
    override var childForStatusBarStyle: UIViewController? {
        return topViewController
    }
    
    override var viewControllers: [UIViewController] {
        didSet { setNeedsStatusBarAppearanceUpdate() }
    }
}

对于 UINavigationController - UIViewController 结构,将下面的代码添加到导航控制器。然后覆盖子视图控制器的 preferredStatusBarStyle,它对我有用。

override var childForStatusBarStyle: UIViewController? {
    visibleViewController
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    visibleViewController?.preferredStatusBarStyle ?? .default
}