隐藏在模态视图中的状态栏(在全屏演示中)

Posted

技术标签:

【中文标题】隐藏在模态视图中的状态栏(在全屏演示中)【英文标题】:status bar hidden in modal view (over fullscreen presentation) 【发布时间】:2016-02-06 09:46:52 【问题描述】:

尝试从模式视图中隐藏状态栏。

已经检查了几种方法:

override func prefersStatusBarHidden() -> Bool 
    return true


with / without self.setNeedsStatusBarAppearanceUpdate()

还有

UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .Fade)

但在 ios 9 中已贬值

这适用于全屏演示(模态 segue 演示选项),但请注意全屏,这是我的设置。

如果你有任何想法..

【问题讨论】:

请查看***.com/questions/32808593/…,我认为它可以解决您的问题。 嗨,谢谢,但同样的问题。适用于全屏演示,但不适用于全屏设置.. 首先进入 plist 并检查基于视图控制器的状态栏外观是否设置为 YES 并设置您尝试过的 prefersStatusBarHidden()。 同样的问题,但谢谢。 【参考方案1】:

对于视图控制器的非全屏演示,您需要使用modalPresentationCapturesStatusBarAppearance 属性。

例如

toViewController.modalTransitionStyle = .coverVertical
toViewController.modalPresentationStyle = .overFullScreen
toViewController.modalPresentationCapturesStatusBarAppearance = true

fromViewController.present(toViewController,
            animated: true,
            completion: nil)

对于视图控制器的全屏演示,您需要:

    设置新VC的modalPresentationStyle。 在新的 VC 中覆盖 prefersStatusBarHidden 将您的应用 plist UIViewControllerBasedStatusBarAppearance 值设置为 YES

例如

toViewController.modalTransitionStyle = .coverVertical
toViewController.modalPresentationStyle = .fullScreen

fromViewController.present(toViewController,
            animated: true,
            completion: nil)

(是的,iOS 中的状态栏设置非常糟糕。难怪 Stack Overflow 有这么多关于这个主题的问题,以及这么多不同的答案。)

【讨论】:

.coverVertical 有必要吗? 不,这是默认值【参考方案2】:

要在进行全屏模式时隐藏状态栏,您需要在 viewDidLoad 中进行设置:

override func viewDidLoad() 
    super.viewDidLoad()    
    modalPresentationCapturesStatusBarAppearance = true

然后做隐藏状态栏的标准方法:

override var prefersStatusBarHidden: Bool 
    return true

【讨论】:

【参考方案3】:

确实会自动调用FullScreen 状态栏更新,但不适用于OverFullScreen

此外,在我的情况下,我需要处理堆栈中的导航控制器,将 ModalViewController 作为子级传递:

extension UINavigationController 

    public override func childViewControllerForStatusBarHidden() -> UIViewController? 
        return self.visibleViewController
    

    public override func childViewControllerForStatusBarStyle() -> UIViewController? 
        return self.visibleViewController
    

ModalViewController 内部,我们手动更新状态栏,同样为了使其流畅,我们必须在 viewWillDisappear 中这样做,但此时 visibleViewController 仍然是 ModalViewController,没有什么可以使用内部 bool statusBarHidden 并相应地更新它

override func viewWillAppear(animated: Bool) 
    super.viewWillAppear(animated)
    self.statusBarHidden = true
    self.setNeedsStatusBarAppearanceUpdate()

override func viewWillDisappear(animated: Bool) 
    super.viewWillDisappear(animated)
    self.statusBarHidden = false
    self.setNeedsStatusBarAppearanceUpdate()

override func prefersStatusBarHidden() -> Bool 
    return self.statusBarHidden

【讨论】:

【参考方案4】:

如果您正在使用情节提要并且想要隐藏/显示状态栏,您可以在之前的视图控制器上使用此方法:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
      UIApplication.shared.setStatusBarHidden(false, with: UIStatusBarAnimation.none)

【讨论】:

以上是关于隐藏在模态视图中的状态栏(在全屏演示中)的主要内容,如果未能解决你的问题,请参考以下文章

Electron 应用程序 - 如何在全屏模式下禁用/隐藏任务栏中的窗口

在全屏模式下显示状态栏 Ionic for android 和 iOS

同时状态栏隐藏和视图转换

如何让Safari全屏 把上面的状态栏隐藏掉

VM全屏后 鼠标放在顶部 隐藏的状态栏不会显示

仅在模态显示的视图控制器上隐藏状态栏