导航栏在隐藏时没有动画但在重新出现时仍然有动画 [英] Navbar not animating while hiding but still animates while reappearing

查看:27
本文介绍了导航栏在隐藏时没有动画但在重新出现时仍然有动画的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I followed this answer and added a UIGestureRecognizer to show or hide the Navbar and Toolbar. Strangely, the Navbar is not silding while hiding but it still slides when it reappears. the toolbar is animating all the time.

我将代码更改为:

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

看看它在隐藏时是否被调用并被调用.我还尝试将 automaticallyAdjustsScrollViewInsets 设置为 false,正如同一答案中的评论所建议的那样,但仍然没有运气.

to see if it's being called when it hides and it is getting called. I also tried setting automaticallyAdjustsScrollViewInsets to false as suggested by the comments from the same answer but still no luck.

我在任何地方都找不到有关此问题的任何信息.

I can't find any information about this issue anywhere.

这是我的完整代码:

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 上使用时,由于某种原因,导航隐藏时栏没有动画并突然消失.

The following Swift 4 code works fine with iOS 11 but does not work as expected for iOS 10. When using it with iOS 10, for some reason, the navigation bar does not animate when hiding and suddenly disappears.

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() 属性:


In order to fix this, you can use the following ViewController implementation that uses UIViewController's setNeedsStatusBarAppearanceUpdate() property:

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.


See this answer that shows up to 3 different ways to toggle both status bar and navigation bar for Swift 4 and iOS 11.

这篇关于导航栏在隐藏时没有动画但在重新出现时仍然有动画的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆