【问题标题】:Navbar not animating while hiding but still animates while reappearing导航栏在隐藏时不动画,但在重新出现时仍然动画
【发布时间】:2017-07-11 23:13:28
【问题描述】:

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

我把代码改成:

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

查看当它隐藏并被调用时是否被调用。我还尝试按照 cmets 的建议将 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
}

【问题讨论】:

    标签: ios iphone swift swift3 uistatusbar


    【解决方案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
        }
    
    }
    

    为了解决这个问题,您可以使用以下使用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
        }
    
    }
    

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

    【讨论】:

      【解决方案2】:

      试试这个:

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

      【讨论】:

      • 感谢您的回答,但由于某种原因,此代码根本不起作用!我必须调用navigationController?.setNavigationBarHidden 来隐藏导航栏,使用setNeedsStatusBarAppearanceUpdate(),没有任何变化。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2017-08-23
        • 1970-01-01
        • 1970-01-01
        • 2015-06-14
        • 1970-01-01
        • 1970-01-01
        • 2021-02-20
        • 2020-08-04
        • 2017-03-03
        相关资源
        最近更新 更多