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

时间:2017-07-11 23:13:29

标签: ios iphone swift swift3 uistatusbar

我关注了this answer并添加了UIGestureRecognizer来显示或隐藏导航栏和工具栏。奇怪的是,Navbar在隐藏时不会sil but,但是当它重新出现时它仍然会滑动。工具栏一直是动画。

我将代码更改为:

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

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

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

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

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
}

3 个答案:

答案 0 :(得分:1)

以下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实施,该实施使用UIViewController' setNeedsStatusBarAppearanceUpdate()属性:

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的状态栏和导航栏。

答案 1 :(得分:0)

试试这个:

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

答案 2 :(得分:0)

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