导航栏在隐藏时没有动画,但在重新出现时仍然有动画

Navbar not animating while hiding but still animates while reappearing

我按照 this answer 添加了一个 UIGestureRecognizer 来显示或隐藏导航栏和工具栏。奇怪的是,导航栏在隐藏时并没有滑动,但在重新出现时仍然滑动。工具栏一直在动画。

我将代码更改为:

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
}

试试这个:

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

以下 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
    }

}

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

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
    }

}

请参阅 this answer,它显示了最多 3 种不同的方式来切换 Swift 4 和 iOS 11 的状态栏和导航栏。

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