给出以下情况:
iOS 8+ 应用程序(主要是 Swift)。状态栏设置为View controller-based status bar appearance
。在应用程序中,多个 UIActivityViewController 用于显示共享选项。
问题:某些共享活动的状态栏颜色错误。这些是使用时显示的设备安装的扩展UIActivityViewController。这里:分享活动,例如WhatsApp、Tumblr、Skype。
我想要实现什么:此应用程序的默认 StatusBarStyle 是 .LightContent 以适合本地 UIAppearance(对基本 NavigationController 类进行着色)。远程全屏控制器应获取 .Default StatusBarStyle,而模态对话框应保留当前样式 (.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, e.g. Facebook, WhatsApp, Reminders etc.
// let rawPresentationStyle = presentedViewController.modalPresentationStyle.rawValue
// rawPresentationStyle == 17 (0x11) is undocumented Raw Value for SLComposeViewController dialogs
return presentedViewController
case is UIActivityViewController:
// i.e. "More" Activity, UIActivityViewController internally uses presentViewController again to show "More" View
// presentedViewController.modalPresentationStyle != presentedViewController.presentedViewController.modalPresentationStyle (e.g. .Popover to .OverCurrentContext)
let presentedStyle = presentedViewController.presentedViewController?.modalPresentationStyle // UIActivity > presented
if presentedStyle == .OverFullScreen {
return presentedViewController
}
default:
break
}
return nil // use local preferredStatusBarStyle
}
该代码运行良好。验证每一步的开关都是正确的。但是,SLComposeViewController 启动 XPC 远程视图:SLRemoteComposeViewController
和...一起_UIRemoteView
.
两者都没有设置.modalPresentationStyle
,所以没有办法获取这个值来决定是否将控制权交给presentedViewController。
基本上来说,无论 XPC 远程视图是模态的(在当前上下文上变暗)还是全屏,当将控制权返回到 self.presentedViewController 时,StatusBar 都会变成 .Default。
我能够追踪到 XPC。 SLComposeViewController 的 modalPresentationStyle 是未记录的样式 17 (0x11)。
有人知道如何与 UIActivityViewController 一起为社交共享设置正确的 StatusBar 吗?
编辑:
我也尝试设置View controller-based status bar appearance
到没有。通过这个设置preferredStatusBarStyle
and childViewControllerForStatusBarStyle:
根据文档,根本没有被调用。但无论如何,无论状态栏是 .LightContent 还是 .Default,这都行不通。要么是远程模态活动错误,要么是远程全屏活动错误。当然,远程 XPC 视图不受开发人员的控制。据我所知,扩展开发人员(Facebook、WhatsApp 等)反过来也有同样的问题:他们也无法控制 StatusBar。
我缺少任何雷达吗?
Edit2:更改了标题,我也知道 modalPresentationCapturesStatusBarAppearance。
我发现 Tumblr 工程团队在 2014 年的某个时候发表了一篇有趣的博客文章,他们在创建共享扩展时也遇到了无法修复的 StatusBar 问题。看http://engineering.tumblr.com/post/97658880154/what-we-learned-building-the-tumblr-ios-share http://engineering.tumblr.com/post/97658880154/what-we-learned-building-the-tumblr-ios-share- 指向:http://openradar.appspot.com/radar?id=6397505050771456 http://openradar.appspot.com/radar?id=6397505050771456
解决方法
到目前为止还没有。 Info.plist 键和视图控制器方法都不是
成功了,我们甚至无法获取键盘窗口的句柄
应用程序通常可以使用私有 API 来完成的方式(山姆
吉丁斯几乎要疯了。谢谢萨姆!)。在此希望有一个
在 iOS 8.1 中执行此操作的方法。
我也几乎疯狂地尝试;)