iOS13 状态栏样式无效(从未调用过 childForStatusBarStyle)
iOS 13 Status bar style invalid (childForStatusBarStyle never called)
我搜索了很多,但没有在 Whosebug 或其他任何地方找到与我相同的问题。
设置
Info.plist
ViewControllerBasedStatusBar
设置为 YES
StatusBarStyle
设置为 .lightContent
UserInterfaceStyle
设置为.light
(应用不支持.dark
模式)
- 每个
UIViewController
都有自己的 preferredStatusBarStyle
实现:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
UITabBarController
有 extension
:
open override var childForStatusBarStyle: UIViewController? {
return selectedViewController
}
UINavigationController
有 extension
:
override open var childForStatusBarStyle: UIViewController? {
return topViewController
}
问题
自从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
。
更多:
- Xcode:版本 11.5 (11E608c)
- 设备:iPhone 8 模拟器
- iOS: 版本 13.5
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
}
我搜索了很多,但没有在 Whosebug 或其他任何地方找到与我相同的问题。
设置
Info.plist
ViewControllerBasedStatusBar
设置为YES
StatusBarStyle
设置为.lightContent
UserInterfaceStyle
设置为.light
(应用不支持.dark
模式)
- 每个
UIViewController
都有自己的preferredStatusBarStyle
实现:override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
UITabBarController
有extension
:open override var childForStatusBarStyle: UIViewController? { return selectedViewController }
UINavigationController
有extension
:override open var childForStatusBarStyle: UIViewController? { return topViewController }
问题
自从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
。
更多:
- Xcode:版本 11.5 (11E608c)
- 设备:iPhone 8 模拟器
- iOS: 版本 13.5
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
}