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

rap*_*ael 14 hidden statusbar modalviewcontroller ios

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

已经检查了几种方法:

override func prefersStatusBarHidden() -> Bool {
    return true
}

with / without self.setNeedsStatusBarAppearanceUpdate()
Run Code Online (Sandbox Code Playgroud)

UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .Fade)
Run Code Online (Sandbox Code Playgroud)

但在iOS 9中折旧

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

如果你有任何想法..

Wom*_*ble 49

对于View Controller 的非全屏演示,您需要使用该modalPresentationCapturesStatusBarAppearance属性.

例如

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

fromViewController.present(toViewController,
            animated: true,
            completion: nil)
Run Code Online (Sandbox Code Playgroud)

要获得View Controller 的全屏演示,您需要:

  1. 设置新的VC modalPresentationStyle.
  2. prefersStatusBarHidden在新VC中覆盖
  3. 将您的应用程序plist UIViewControllerBasedStatusBarAppearance值设置为YES

例如

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

fromViewController.present(toViewController,
            animated: true,
            completion: nil)
Run Code Online (Sandbox Code Playgroud)

(是的,iOS中的状态栏设置非常糟糕.难怪Stack Overflow在这个问题上有很多问题,而且答案也很多.)


bnu*_*sey 6

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

override func viewDidLoad() {
    super.viewDidLoad()    
    modalPresentationCapturesStatusBarAppearance = true
}
Run Code Online (Sandbox Code Playgroud)

然后执行标准方法隐藏状态栏:

override var prefersStatusBarHidden: Bool {
    return true
}
Run Code Online (Sandbox Code Playgroud)


Vad*_*lov 2

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

此外,在我的例子中,我需要处理堆栈中的导航控制器,以将ModalViewController作为子对象传递:

extension UINavigationController {

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

    public override func childViewControllerForStatusBarStyle() -> UIViewController? {
        return self.visibleViewController
    }
}
Run Code Online (Sandbox Code Playgroud)

在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
}
Run Code Online (Sandbox Code Playgroud)