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

6

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

override var prefersStatusBarHidden: Bool {
    return true
}

B上。为了在状态栏出现或消失时实现平滑动画,我还覆盖了该属性。

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
    return .slide
}

然而,当我从 A 呈现视图控制器 B 时,状态栏会在动画模态转换开始之前突然消失,而此时 A 仍然可见。 我正在寻找一种方法来解决这个“跳跃状态栏”的问题。 理想情况下,我希望有一个清晰的分离:
  • A:显示状态栏
  • B:不显示状态栏
因此,当我呈现 B 时,它会被状态栏覆盖。 由于状态栏似乎是一个全局视图,不属于任何特定的视图控制器,因此可能很难实现这种行为。 因此,如果无法复制此精确的动画行为,则在视图控制器过渡期间平稳地滑出状态栏也可以令人满意。 我该如何做到这一点?
1个回答

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()
    }
}

如果您希望在模态视图控制器被解除时获得相反的效果,则需要执行相反的操作。
您可以调整动画的持续时间以适合您的需要,尽管我不确定“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()
        }
    }
}

我同意这一点,对于许多人想要的东西来说,这是过多的代码。


谢谢你的回答。其中一半有效,另一半(在解除视图控制器时的“相反”)无效。看起来你需要在参与转换的两个视图控制器中都添加代码,以获得平滑的滑入和滑出动画状态栏。稍后我会添加另一个答案来解释这种方法。苹果让这变得如此复杂并且不自动播放状态栏的动画真的很烦人 - 我声称在99%的情况下,这将是开发人员想要的行为。 - Mischa
抱歉,我应该更好地澄清“相反”的含义!我想可能会出现这种情况。返回过渡似乎也需要更多技巧。我认为你可能需要利用 viewWillDisappear 以及 viewWillAppear 并确保在设置标志之前移动到需要隐藏状态栏的视图控制器。我也会更新我的答案。 - Samantha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接