我有一个视图控制器A
,它在顶部显示状态栏。从该视图控制器我想呈现隐藏状态栏的另一个视图控制器B
。为了实现这一点,我重写了属性
override var prefersStatusBarHidden: Bool {
return true
}
<{1>} B
。为了在状态栏(dis)出现时强制执行平滑动画,我还会覆盖属性
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
return .slide
}
但是,当我现在从B
呈现视图控制器A
时,状态栏会突然消失 ,而A
仍然可见,就在动画模式转换之前开始。
我正在寻找一种方法来修复此“跳跃状态栏”行为。理想情况下,我希望有一个清晰的分离:
A
:显示状态栏B
:未显示状态栏这样,当我出现B
时,状态栏就会被它覆盖。
由于状态栏似乎是一个不属于任何特定视图控制器的全局视图,因此可能很难实现这种行为。因此,如果无法复制这种精确的动画行为,我也很高兴如果状态栏在视图控制器转换期间顺利滑出。我怎样才能做到这一点?
答案 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()
}
}
}
我同意,对于我想象很多人想要的东西,代码太多了。