隐藏在模态视图中的状态栏(在全屏演示中)
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 应用程序 - 如何在全屏模式下禁用/隐藏任务栏中的窗口