Navbar在隐藏时不动画,但在重新出现时仍然是动画

我按照这个答案添加了一个UIGestureRecognizer来显示或隐藏导航栏和工具栏。 奇怪的是,Navbar在隐藏时并不是在淤塞,但是当它重新出现时它仍然会滑动。 工具栏一直是动画。

我将代码更改为:

 override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { print("got called") return UIStatusBarAnimation.slide } 

看它是否被隐藏并被调用时被调用。 我也尝试将automaticallyAdjustsScrollViewInsets设置为false,如同相同答案的评论所示,但仍然没有运气。

我无法在任何地方找到有关此问题的任何信息。

编辑:这是我的完整代码:

 override func viewDidLoad(){ super.viewDidLoad() self.automaticallyAdjustsScrollViewInsets = false let gesture = UITapGestureRecognizer(target: self, action: #selector(toggle)) view.isUserInteractionEnabled = true view.addGestureRecognizer(gesture) } func toggle() { navigationController?.setNavigationBarHidden(navigationController?.isNavigationBarHidden == false, animated: true) navigationController?.setToolbarHidden(navigationController?.isToolbarHidden == false, animated: true) } override var prefersStatusBarHidden: Bool { print("got called 1") return navigationController?.isNavigationBarHidden == true } override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { print("got called 2") return UIStatusBarAnimation.slide } 

以下Swift 4代码适用于iOS 11,但不能像iOS 10预期的那样工作。当它与iOS 10一起使用时,出于某种原因,导航栏在隐藏时不会动画并突然消失。

 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let gesture = UITapGestureRecognizer(target: self, action: #selector(toggle)) view.addGestureRecognizer(gesture) } @objc func toggle() { navigationController?.setNavigationBarHidden(navigationController?.isNavigationBarHidden == false, animated: true) } override var prefersStatusBarHidden: Bool { return navigationController?.isNavigationBarHidden == true } override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { return UIStatusBarAnimation.slide } } 

为了解决这个问题,您可以使用以下使用UIViewControllersetNeedsStatusBarAppearanceUpdate()属性的ViewController实现:

 class ViewController: UIViewController { override func viewDidLoad(){ super.viewDidLoad() let gesture = UITapGestureRecognizer(target: self, action: #selector(toggle)) view.addGestureRecognizer(gesture) } private var isHidden = false @objc func toggle() { navigationController!.setNavigationBarHidden(!isHidden, animated: true) isHidden = navigationController!.isNavigationBarHidden UIView.animate(withDuration: 0.3) { self.setNeedsStatusBarAppearanceUpdate() } } override var prefersStatusBarHidden: Bool { return isHidden } override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { return UIStatusBarAnimation.slide } } 

作为替代方案,您还可以使用下面的UIViewController实现:

 import UIKit class ViewController: UIViewController { override func viewDidLoad(){ super.viewDidLoad() let gesture = UITapGestureRecognizer(target: self, action: #selector(toggle)) view.addGestureRecognizer(gesture) } private var isHidden: Bool = false { willSet { self.navigationController!.setNavigationBarHidden(!self.isHidden, animated: true) } didSet { UIView.animate(withDuration: 0.3) { self.setNeedsStatusBarAppearanceUpdate() } } } @objc func toggle() { isHidden = !isHidden } override var prefersStatusBarHidden: Bool { return isHidden } override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { return UIStatusBarAnimation.slide } } 

查看此答案 ,显示最多3种不同的方式来切换Swift 4和iOS 11的状态栏和导航栏。

尝试这个:

 class ViewController: UIViewController { var isHidden:Bool = false @IBAction func clicked(sender: AnyObject) { isHidden = !isHidden UIView.animateWithDuration(0.5) { () -> Void in self.setNeedsStatusBarAppearanceUpdate() } } override func preferredStatusBarUpdateAnimation() -> UIStatusBarAnimation { return UIStatusBarAnimation.Slide } override func prefersStatusBarHidden() -> Bool { return isHidden } } 

问题是在iOS 11中NavigationController?。isNavigationBarHidden总是返回false。 在iOS 10中,此代码工作正常。 我还没有找到解决方法(((