状态栏样式与 ParentViewController 不同的模态视图控制器

Posted

技术标签:

【中文标题】状态栏样式与 ParentViewController 不同的模态视图控制器【英文标题】:Modal View Controller with Different StatusBar Style than the ParentViewController 【发布时间】:2016-02-06 23:31:13 【问题描述】:

我有一个带有 Light Status Bar Style 的视图控制器,然后用户可以按下一个按钮,该按钮以模态方式显示 Game Center 排行榜。但是,当父视图控制器具有 .LightContent 样式时,我希望模态视图控制器具有 .Default 样式。这可能吗?模态视图控制器的样式可以与父视图控制器不同吗?如果是这样,我将如何实现这一目标?

【问题讨论】:

绝对有可能。在每个视图控制器中,您是否覆盖了- preferedStatusBarStyle: @ajfigueroa 实际上,因为我要展示 Game Center 排行榜,所以我没有 Game Center 排行榜的视图控制器。 【参考方案1】:

我也遇到了同样的问题。我的解决方案是覆盖:GKGameCenterViewControllerclass 然后我关注了answer here:我添加了 preferredStatusBarStyle() 方法进入我的覆盖视图控制器,并在 .plist 文件中将 UIViewControllerBasedStatusBarAppearance 设置为 NO

【讨论】:

只是一个问题,但由于某种原因,当我使用您的解决方案时,整个应用程序状态栏的外观变黑。我如何有一些白色的状态栏颜色?有没有办法做到这一点? 我还将preferredStatusBarStyle() 放入我的BaseViewController 中,用作我所有视图控制器的父类。 我已经这样做了,但是当我在plist中将值设置为NO时它不起作用,当plist中的值设置为YES时它起作用。 Navigationview有你的看法吗? 不,我没有将视图嵌入到导航视图中。如果基于视图控制器的状态栏外观设置为“是”,则视图具有白色状态栏,但 Game Center 视图状态栏是白色而不是黑色【参考方案2】:

好吧,我想我找到了一个很好的解决方案。基本上在模态演示时,您有一个completionHandler。在completionHandler 中,当您呈现模态视图时,放置这些代码行:

self.setStatusBarStyle(.Default)
self.setNeedsStatusBarAppearanceUpdate()

当您关闭模态视图时:

self.setStatusBarStyle(.LightContent)
self.setNeedsStatusBarAppearanceUpdate()

确保不要在视图控制器中实现 preferredStatusBarStyle。该方法让我失望,如果您实现了 preferredStatusBarStyle 方法,它将覆盖 setStatusBarStyle 方法,这个技巧将不起作用。基本上不要实现preferredStatusBarStyle。

【讨论】:

【参考方案3】:

这为我解决了:

modalViewController.modalPresentationStyle = .overCurrentContext

【讨论】:

【参考方案4】:

以下答案基于@Harish 的解决方案。在您特定的UIViewController(或您自己的基类)中添加:

var statusBarStyle: UIStatusBarStyle = .lightContent
override var preferredStatusBarStyle: UIStatusBarStyle 
    return statusBarStyle

然后调用:

self.statusBarStyle = .default // or .lightContent
self.setNeedsStatusBarAppearanceUpdate()

只要你想改变状态栏样式。

【讨论】:

以上是关于状态栏样式与 ParentViewController 不同的模态视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

状态栏样式与 ParentViewController 不同的模态视图控制器

UIStatusBar样式与UINavigationBar一致

iOS 13 状态栏样式无效(childForStatusBarStyle 从未调用)

iOS 7 状态栏在 iPhone 应用程序中回到 iOS 6 默认样式?

iOS 7 状态栏在 iPhone 应用程序中回到 iOS 6 默认样式?

iOS 7 状态栏在 iPhone 应用程序中回到 iOS 6 默认样式?