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

时间:2017-06-12 15:59:39

标签: ios uiviewcontroller show-hide statusbar

我有一个视图控制器A,它在顶部显示状态栏。从该视图控制器我想呈现隐藏状态栏的另一个视图控制器B。为了实现这一点,我重写了属性

override var prefersStatusBarHidden: Bool {
    return true
}
<{1>} B。为了在状态栏(dis)出现时强制执行平滑动画,我还会覆盖属性

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
    return .slide
}

但是,当我现在从B呈现视图控制器A时,状态栏会突然消失 ,而A仍然可见,就在动画模式转换之前开始。

我正在寻找一种方法来修复此“跳跃状态栏”行为。理想情况下,我希望有一个清晰的分离:

  • A显示状态栏
  • B未显示状态栏

这样,当我出现B时,状态栏就会被它覆盖。

由于状态栏似乎是一个不属于任何特定视图控制器的全局视图,因此可能很难实现这种行为。因此,如果无法复制这种精确的动画行为,我也很高兴如果状态栏在视图控制器转换期间顺利滑出。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:4)

要在转换过程中为状态栏设置动画,您可以在视图控制器B中执行以下操作:

var willAppear = false

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
    return .slide
}

override var prefersStatusBarHidden: Bool {
    return willAppear
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)
    willAppear = true
    UIView.animate(withDuration: 0.5) {
        self.setNeedsStatusBarAppearanceUpdate()
    }
}

然后我想如果你想在模态控制器被解除时你想要反向效果,你需要做相反的事情。

您可以将动画的持续时间调整为适合您的任何内容,但我不确定viewWillAppear与模态控制器实际完全呈现之间的持续时间是否一致。

修改

&#34;对面&#34;最终成为这样的东西(在视图控制器A中):

var willAppear = false

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
    return .slide
}

override var prefersStatusBarHidden: Bool {
    return willAppear
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    if let _ = presentedViewController as? B {
        willAppear = true
    }
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)
    if let _ = presentedViewController as? B {
        willAppear = false
        UIView.animate(withDuration: 0.5) {
            self.setNeedsStatusBarAppearanceUpdate()
        }
    }
}

我同意,对于我想象很多人想要的东西,代码太多了。