状态栏在iOS 9+中发脾气

如果您的应用支持iOS 9+ ,则您已使用修改了状态栏样式。

  UIApplication.shared.setStatusBarStyle( 
.lightContent,
动画:真实

..那么您一定已经看到上面的警告说它已经过时了! 与往常一样,它也建议我们使用替代的新方法。

 覆盖var preferredStatusBarStyle:UIStatusBarStyle { 
返回.lightContent
}

如果您还没有使用过它,那么就让我们来谈谈吧,您可以跳到下一部分,我在这里讨论了在某些情况下它如何发脾气😒

preferredStatusBarStyleUIViewController上的新UIViewController 。 必须在自定义视图控制器中覆盖它,这意味着在这里您可以控制其状态栏(黑色或白色👍)的样式。 每当加载控制器时,都会调用此属性。

在某些情况下,您的控制器可能希望根据某些条件(例如您滚动了多少)来再次更新其状态栏样式。 在这种情况下,您可以致电..

  setNeedsStatusBarAppearanceUpdate() 

此方法强制iOS更新其状态栏,并且在此过程中它将调用preferredStatusBarStyle 再次👍。 因此,您也可以根据需要强制iOS更新其状态栏😊

一切看起来不错吧? 😈

在一种情况下,这是行不通的,即您的控制器已嵌入导航堆栈中。 原因是iOS需要父控制器 (而不是子控制器) 决定需要显示哪种状态栏! 让我们看看在这种情况下会发生什么。

  • 子控制器的preferredStatusBarStyle 不会被调用
  • 其父导航控制器的 preferredStatusBarStyle 被调用

现在不用担心,您不必UINavigationController子类来处理状态栏更新。 相反,我们可以利用扩展来进行救援。

您只需在代码库中添加以下逻辑即可。

 扩展UINavigationController { 
 打开覆盖var preferredStatusBarStyle:UIStatusBarStyle { 
返回topViewController?.preferredStatusBarStyle? 。默认
}
  } 

..此逻辑仅表示您正在要求导航堆栈的topViewController决定需要显示哪种状态栏,以显示topViewController除了屏幕上当前的控制器topViewController什么都没有! 这样,您仍然可以在当前控制器中处理更新🚀

不确定为什么苹果决定这样做,但我们必须应对它