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

标签 ios iphone swift swift3 uistatusbar

我关注了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
}

最佳答案

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

关于ios - 导航栏在隐藏时没有动画,但在重新出现时仍然有动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45045885/

相关文章:

iphone - iCloud - 移动文件完成

Swift:可选值中的可选文本

java - 类将java中的HashMap转换为swift中的NSDictionary

iphone - 再次获取允许或不允许用户定位到 iPhone 模拟器的消息

ios - 以编程方式更改 tabBar 项目?

android - 适用于 Android 的 Instagram 自定义 URL 方案

ios - 在 UITextField swift 3.0 中使用数字键盘以 dd-MM-yyyy 格式输入日期

multithreading - 为什么在辅助线程上操作 UIView 不会引发错误?

ios - 找不到您输入的 Apple ID 或您的密码不正确,待开发者发布

iphone - 将数组拆分为三个单独的数组