仅在模式呈现的视图控制器上隐藏状态栏



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

override var prefersStatusBarHidden: Bool {
return true
}

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

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
return .slide
}

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

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

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

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

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

为了在过渡期间对状态栏进行动画处理,您可以在视图控制器 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和实际完全呈现的模态控制器之间的持续时间有多一致。

编辑:

"相反"最终是这样的(在视图控制器 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()
}
}
}

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

相关内容

  • 没有找到相关文章

最新更新