在UIActivityViewController中为Extensions设置StatusBar Color

以下情况给出:

iOS 8+ App(主要是Swift)。 StatusBar设置为View controller-based status bar appearance 。 在App中,多个UIActivityViewControllers用于显示共享选项。

问题:某些共享活动的StatusBar颜色错误。 这些是使用UIActivityViewController时显示的设备安装扩展。 这里:共享活动,例如WhatsApp,Tumblr,Skype。

我想要实现的目标 :此应用程序的默认StatusBarStyle是.LightContent以适合本地UIAppearance(着色基础NavigationController类)。 远程全屏控制器应该获得.Default StatusBarStyle,而modal dialog应该保持当前样式(.LightContent)。

我测试了每一个可能的组合,现在我被卡住了。

主视图控制器中的代码(选项卡式应用程序):

  override func preferredStatusBarStyle() -> UIStatusBarStyle { return .LightContent } override func prefersStatusBarHidden() -> Bool { return false } override func childViewControllerForStatusBarStyle() -> UIViewController? { guard let presentedViewController = presentedViewController else { return nil } switch presentedViewController { case is SLComposeViewController: // Social Sharing, eg Facebook, WhatsApp, Reminders etc. // let rawPresentationStyle = presentedViewController.modalPresentationStyle.rawValue // rawPresentationStyle == 17 (0x11) is undocumented Raw Value for SLComposeViewController dialogs return presentedViewController case is UIActivityViewController: // ie "More" Activity, UIActivityViewController internally uses presentViewController again to show "More" View // presentedViewController.modalPresentationStyle != presentedViewController.presentedViewController.modalPresentationStyle (eg .Popover to .OverCurrentContext) let presentedStyle = presentedViewController.presentedViewController?.modalPresentationStyle // UIActivity > presented if presentedStyle == .OverFullScreen { return presentedViewController } default: break } return nil // use local preferredStatusBarStyle } 

代码工作正常。 validation开关在每一步都是正确的。 但是,SLComposeViewController与_UIRemoteView一起启动XPC远程视图: _UIRemoteView

两者都没有设置.modalPresentationStyle ,因此无法获取此值来决定是否对.modalPresentationStyle进行控制。

所以基本上说,无论XPC远程视图是模态的(当前上下文调暗)还是FullScreen,当将控制权返回给self.presentedViewController时,StatusBar变为.Default。

我能够将它追踪到XPC。 SLComposeViewController的modalPresentationStyle是未记录的样式17(0x11)。

有没有人想出如何与UIActivityViewController一起为社交分享设置正确的StatusBar?

编辑:我还尝试将View controller-based status bar appearance为否。 根据此设置,根据文档,根本不调用preferredStatusBarStylechildViewControllerForStatusBarStyle: . 但无论如何,无论状态栏是.LightContent还是.Default,这都行不通。 它是远程Modal活动错误或远程FullScreen活动。 当然,远程XPC视图不受开发人员的控制。 从我学到的扩展开发人员(Facebook,WhatsApp等)反过来也有同样的问题:他们无法控制StatusBar ..

我失踪的任何雷达?

Edit2:更改了标题,我也知道modalPresentationCapturesStatusBarAppearance。

我在Tumblr的工程团队发现了这篇有趣的博客文章,发表在2014年的某个时候,他们在创建共享扩展时也对StatusBar有了无法解决的问题。 请参阅http://engineering.tumblr.com/post/97658880154/what-we-learned-building-the-tumblr-ios-share-指向: http : //openradar.appspot.com/radar?id = 6397505050771456

解决方法

到目前为止没有。 Info.plist键和视图控制器方法都没有工作,我们甚至无法按照应用程序通常使用私有API的方式获得键盘窗口的处理( Sam Giddins差点疯狂尝试 。感谢Sam!)。 这里希望有一种方法可以在iOS 8.1中执行此操作。

我也差点疯了;)