具有与 ParentViewController 不同的 StatusBar 样式的模态视图控制器

Modal View Controller with Different StatusBar Style than the ParentViewController

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

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

好吧,我想我找到了解决问题的好方法。基本上,当以模态方式呈现时,你有一个 completionHandler。当您呈现模式视图时,在 completionHandler 中放置这些代码行:

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

当您关闭模态视图时:

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

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

这为我解决了:

modalViewController.modalPresentationStyle = .overCurrentContext

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

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

然后调用:

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

任何时候你想改变状态栏样式。