状态栏在iOS 9+中发脾气
如果您的应用支持iOS 9+ ,则您已使用修改了状态栏样式。
UIApplication.shared.setStatusBarStyle(
.lightContent,
动画:真实
)
..那么您一定已经看到上面的警告说它已经过时了! 与往常一样,它也建议我们使用替代的新方法。
覆盖var preferredStatusBarStyle:UIStatusBarStyle {
返回.lightContent
}
如果您还没有使用过它,那么就让我们来谈谈吧,您可以跳到下一部分,我在这里讨论了在某些情况下它如何发脾气😒
preferredStatusBarStyle
是UIViewController
上的新UIViewController
。 必须在自定义视图控制器中覆盖它,这意味着在这里您可以控制其状态栏(黑色或白色👍)的样式。 每当加载控制器时,都会调用此属性。
在某些情况下,您的控制器可能希望根据某些条件(例如您滚动了多少)来再次更新其状态栏样式。 在这种情况下,您可以致电..
setNeedsStatusBarAppearanceUpdate()
此方法强制iOS更新其状态栏,并且在此过程中它将调用preferredStatusBarStyle
再次👍。 因此,您也可以根据需要强制iOS更新其状态栏😊
一切看起来不错吧? 😈
在一种情况下,这是行不通的,即您的控制器已嵌入导航堆栈中。 原因是iOS需要父控制器 (而不是子控制器) 决定需要显示哪种状态栏! 让我们看看在这种情况下会发生什么。
- 子控制器的
preferredStatusBarStyle
不会被调用 - 其父导航控制器的
preferredStatusBarStyle
将被调用
现在不用担心,您不必UINavigationController
子类来处理状态栏更新。 相反,我们可以利用扩展来进行救援。
您只需在代码库中添加以下逻辑即可。
扩展UINavigationController {
打开覆盖var preferredStatusBarStyle:UIStatusBarStyle {
返回topViewController?.preferredStatusBarStyle? 。默认
}
}
..此逻辑仅表示您正在要求导航堆栈的topViewController
决定需要显示哪种状态栏,以显示topViewController
除了屏幕上当前的控制器topViewController
什么都没有! 这样,您仍然可以在当前控制器中处理更新🚀
不确定为什么苹果决定这样做,但我们必须应对它