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)
然而,当我现在呈现视图控制器B从A状态栏突然消失,同时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()
}
}
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)
我同意,对于我想很多人想要的东西来说,代码太多了。
| 归档时间: |
|
| 查看次数: |
1297 次 |
| 最近记录: |