popViewController(animated: true) 动画运行缓慢

Posted

技术标签:

【中文标题】popViewController(animated: true) 动画运行缓慢【英文标题】:popViewController(animated: true) animation works slow 【发布时间】:2018-08-15 10:58:07 【问题描述】:

我在 imageView 上添加了一个点击手势识别器,所以当用户点击下面的图片时会调用下面的函数。

@objc func handleTap(_ sender: UITapGestureRecognizer) 

            self.navigationController?.popViewController(animated: true)

当我推送到细节视图控制器动画看起来很好并且工作流畅,但是当我使用上面的方法来 popViewController(animated: true) 动画不是那么流畅,甚至可能会冻结一秒钟。

我还使用 viewWillAppear 和 viewWillDisappear 方法在细节视图控制器中隐藏导航栏。我已经读到这可能会导致动画运行缓慢,但仍然无法找到解决此问题的答案。

  override func viewWillAppear(_ animated: Bool) 
        super.viewWillAppear(animated)
        navigationController?.isNavigationBarHidden = true
    

    override func viewDidDisappear(_ animated: Bool) 
        super.viewWillAppear(animated)
        navigationController?.isNavigationBarHidden = false
    

【问题讨论】:

分配navigationController?.isNavigationBarHidden 对性能的影响不大。我的应用程序可以顺利完成许多这样的任务。一些影响您的 UI 的工作将启动或结束相机会话、初始化 GMSMapView 等。您能否使用您的 View Controller 类的完整代码更新帖子,以便其他人可以重现您的错误并找到适合您情况的更好的解决方案。 这很奇怪,因为当我为 popViewController 使用自定义动画时,因此将默认动画设置为 false 一切都可以正常使用自定义动画。 【参考方案1】:

试试这个,我不确定,但它可能会工作

DispatchQueue.main.async 
            self.navigationController?.popViewController(animated: true)
        

【讨论】:

试过了,对我不起作用。不过还是谢谢。【参考方案2】:

在您覆盖viewDidDisappear(_ animated: Bool) 时,您调用super.viewWillAppear(animated)。正如您现在可能已经知道的那样,您应该调用super.viewDidDisappear(animated)。您更正后的代码应为:

override func viewDidDisappear(_ animated: Bool) 
    super.viewDidDisappear(animated)
    navigationController?.isNavigationBarHidden = false

【讨论】:

以上是关于popViewController(animated: true) 动画运行缓慢的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有警告和错误的闭包内使用 navigationController?.popViewController(animated: true)?

popViewController Animated:自定义过渡动画?

我可以“卷曲”popViewController Animated 上的页面吗?

popViewController Animated 不工作,但后退按钮工作

popViewController Animated 的断断续续的动画:来自警报 View:didDismissWithButtonIndex:

在 popViewController Animated() 之后缺少堆栈中的第一个 ViewController