我有一个包含大量子视图的滚动视图,出于我不想进入的原因,我选择了不使用cell和UITableView。它工作得很好,除了填充视图时的初始主线程滞后。然而,每当一个VC "on top"被取消(e.g. after presenting a modal overtop)时,都会有一个明显的延迟(2-3秒)。我在分析器中运行了它,堆栈跟踪非常深入到IOS / Autolayout中,如所附图像所示。
代码似乎进入了NSLayoutConstraint("+0x06 calll "-[NSLayoutConstraint _addToEngine:]+0x0b")。
我能做些什么来绕过这种明显的约束重新应用吗?

发布于 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自动布局高度“将显示数十个结果。)
祝好运!
https://stackoverflow.com/questions/20066051
复制相似问题