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

Mis*_*cha 6 statusbar show-hide uiviewcontroller ios

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

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

B.为了在状态栏(dis)出现时强制执行平滑动画,我也会覆盖该属性

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
    return .slide
}
Run Code Online (Sandbox Code Playgroud)

然而,当我现在呈现视图控制器BA状态栏突然消失,同时A仍然可见,就在动画模式转换开始之前.

我正在寻找一种方法来解决这个"跳跃状态栏"的行为.理想情况下,我希望有一个干净的分离:

  • A:显示状态栏
  • B:不显示状态栏

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

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

Sam*_*tha 5

为了在过渡期间动画状态栏,您可以在视图控制器 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()
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:

“相反”最终是这样的(在视图控制器 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()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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