首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由于自动收费表和大量的子视图,退出VC的速度非常慢

由于自动收费表和大量的子视图,退出VC的速度非常慢
EN

Stack Overflow用户
提问于 2013-11-19 07:54:34
回答 1查看 2.8K关注 0票数 3

我有一个包含大量子视图的滚动视图,出于我不想进入的原因,我选择了不使用cellUITableView。它工作得很好,除了填充视图时的初始主线程滞后。然而,每当一个VC "on top"被取消(e.g. after presenting a modal overtop)时,都会有一个明显的延迟(2-3秒)。我在分析器中运行了它,堆栈跟踪非常深入到IOS / Autolayout中,如所附图像所示。

代码似乎进入了NSLayoutConstraint("+0x06 calll "-[NSLayoutConstraint _addToEngine:]+0x0b")

我能做些什么来绕过这种明显的约束重新应用吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-11 01:24:56

为什么滚动视图的性能不佳

从您的跟踪来看,问题的根源是在转换回来时开始的:您将您的80%+时间花在-[UITransitionView transition:fromView:toView:removeFromView:]上。此方法立即将您转换回的视图添加到视图层次结构中( -addSubview:调用如下),这需要一个完整的自动布局传递。

我不知道有什么方法可以强迫普通的iOS视图控制器转换系统将旧视图保持在后台,也就是说,以避免这种自动布局传递。(如果多个视图在屏幕外堆叠并开始造成内存压力,这种方法实际上可能会遇到它自己的一组问题。)

加快现有结构中的自动布局

尽管如此,您可以尝试优化您的汽车布局通过几种方式。首先,修改滚动视图以减少子视图。苹果公司的开发者技术支持有时也建议将视图层次结构扁平化;让自动布局减少递归有时也会有帮助。(例如,请参见弗洛里安·库格勒马丁·皮尔金顿执行的性能测试。)

您还应该始终确保在层次结构中最深的可能视图上安装约束,同时仍然安装在与其相关的两个视图的共同祖先上。例如,如果视图A有子视图B和C,则需要一个约束引用仅在视图C上安装的视图C,而不是视图A;但是,与B和C相关的约束必须存在于A上。这是所有自动布局工作的良好指南,而不仅仅是在这种情况下;层次结构中安装的约束越深,底层解决程序在任何特定级别上的工作速度就越快。

改变你的方法

UITableView可以通过在自动布局系统中提供一种中断来避免这个问题:表视图可以使用约束正确地定位,然后使用自己的委托方法(如-tableView:heightForRowAtIndexPath:)和一些内部布局魔术为每个单元单元单独运行自动布局,而不需要一次性地布局整个视图。常规UIScrollViews没有这种优化的奢侈性。

我知道您说过在这里不采用UITableView是有原因的,但是您可能会考虑重新考虑这些原因。通过切换到UITableView和实现委托方法-tableView:estimatedHeightForRowAtIndexPath:,您可以看到一些非常显著的速度改进,这使您可以在查看加载时进行大量的自动布局计算,并将它们推迟到即将在屏幕上滚动一个新单元格的时候。在这个方向上已经做了一些相当重要的实验,无论是在StackOverflow上还是社区中的其他人。(快速搜索"UITableView自动布局高度“将显示数十个结果。)

祝好运!

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20066051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档