我有一个视图控制器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()
}
}
}
我同意,对于我想很多人想要的东西来说,代码太多了。