2017-06-12 57 views
4

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

override var prefersStatusBarHidden: Bool { 
    return true 
} 

on B。为执行每当状态栏(DIS)出现的平滑动画我还重写属性

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { 
    return .slide 
} 

然而,当我现在本视图控制器BA状态栏消失突然A仍然可见,右在动画模态转换开始之前。

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

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

,这样,当我提出B,状态栏由它覆盖。

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

回答

2

在过渡过程中动态显示状态栏,你可以做这样的事情在视图控制器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() 
     } 
    } 
} 

这一点我同意,是这样的东西太多的代码,我想很多人们想要。

+0

感谢您的回答。其中一半有效,另一半(解散视图控制器时“相反”)不适用。您似乎需要向参与转换的_both_视图控制器添加代码,以便为状态栏获得平滑的滑入和滑出动画。稍后我会添加另一个答案来解释这种方法。苹果真的很烦人,因为它使得这个过程变得如此复杂,并且不会自动为状态栏添加动画 - 我声称在99%的情况下,这就是开发者想要的行为。 – Mischa

+0

对不起,我应该澄清“对面”更好!我认为可能会发生。过渡回来似乎也会有点棘手。我想你可能需要使用'viewWillDisappear'和'viewWillAppear',并确保你在设置标志之前移动到需要隐藏状态栏的视图控制器。我也会更新我的答案。 – Samantha

+0

@Samantha谢谢它帮助我... –