iOS:UIViewControllerBasedStatusBarAppearance YES的默认状态栏样式

Tom*_*ina 9 ios uiappearance ios7-statusbar

有没有办法在保持UIViewControllerBasedStatusBarAppearance启用的同时设置默认状态栏样式?

这是问题,我正在处理:

UIStatusBarStyle.LightContent由于导航栏背景较暗,因此几乎需要使用整个应用程序.最初,UIViewControllerBasedStatusBarAppearance被禁用,并且Info.plist在文本状态状态栏中设置了以下内容:

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
Run Code Online (Sandbox Code Playgroud)

这工作得很好,直到我发现这个.LightContent状态栏甚至显示为某些共享扩展,如Facebook Messenger,导致它不可读:

Facebook Messenger Share Extension灯状态栏样式

这可以通过使用来解决UIViewControllerBasedStatusBarAppearance,但是我需要将以下方法添加到我想要避免的所有视图控制器中,因为应用程序非常大.

此外,对于具有轻型导航栏背景的应用程序中的一个屏幕,我使用UIApplication.sharedApplication().setStatusBarStyle()但是在iOS 9中不推荐使用此方法.

任何想法如何解决这个问题?混写?

Tom*_*ina 6

解决方案

最简单、最干净的方法是在AppDelegate'sapplication:willFinishLaunchingWithOptions方法中添加以下行:

UINavigationBar.appearance().barStyle = .Black
Run Code Online (Sandbox Code Playgroud)

这将使.LightContent作为默认的状态栏样式深入应用,只要你的应用程序使用UINavigationController

Info.plist如果要.LightContent在启动画面启动期间使用状态栏样式,请不要忘记在应用程序中保留以下设置:

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
Run Code Online (Sandbox Code Playgroud)

TL; 博士

我当前的设置与许多其他应用程序非常相似,UITabBarController用作最顶部的控制器,UINavigationController每个选项卡都有堆栈。

UINavigationController处理状态栏样式(应该如此)并且不调用preferredStatusBarStyle()其子视图控制器。因此,在我的情况下,实现par 提出子类化解决方案不起作用。

进一步继承UINavigationController 我正在使用的自定义子类也不是一个干净的解决方案。

现在,由于应用程序UIViewControllerBasedStatusBarAppearance在应用程序本身的任何地方都启用并更正了状态栏样式,SFSafariViewController并且共享扩展(如消息、邮件等)也使用正确的 ( .Default) 状态栏样式。

不使用正确状态栏样式的唯一例外是问题中提到的 Facebook Messenger 的共享扩展。但是,这似乎是扩展程序本身的一个错误,因为我尝试过的所有使用.LightContent状态栏样式的应用程序(例如 Twitter)都有相同的问题 - 来自应用程序的 FB Messenger 共享扩展程序有一个白色的状态栏文本。