我可以通过减少调用 [CALayer LayoutSubviews] 来使我的 tableview 移动得更流畅,如何?

Posted

技术标签:

【中文标题】我可以通过减少调用 [CALayer LayoutSubviews] 来使我的 tableview 移动得更流畅,如何?【英文标题】:Can I make my tableview move more fluidly by reducing calling [CALayer LayoutSubviews], and how? 【发布时间】:2012-12-05 06:47:14 【问题描述】:

根据时间配置,我发现我的应用由于调用了[UITable layoutSubviews],在[CALayer layoutSublayers]上浪费了太多时间。所以生成tableview的动作并不流畅,每当第一次点击按钮时,我都会等待近2秒才能看到下一个视图。下一个视图的表格视图中的每个单元格都有 8 个子视图,导致 layoutSubviews 占用了太多时间。因此我想知道如何优化这个进度,我不想在它的drawrect中构建一个包含这8个子视图的自定义单元格:以避免layoutSubviews。谁能帮帮我?

【问题讨论】:

您是否也看到滚动时的性能问题? 【参考方案1】:

我的猜测是,您看到的只是症状,而不是真正的问题。

我会等将近 2 秒才能看到下一个视图

您所描述的内容听起来像是您在第一次尝试显示时会预渲染 所有 表格视图的单元格(导致大量布局成本)。 在cellForRowAtIndexPath: 中设置断点,添加声音操作 + 激活“评估后自动继续”以进行调试。 它应该只被调用 10 次左右(取决于同时可见的行数)。

如果您在长列表中使用heightForRowAtIndexPath:,这可能是您的问题的根源(取决于您的实现)。在这种情况下,请考虑避免使用它。如果您以 ios 7 为目标,请查看 tableView:estimatedHeightForRowAtIndexPath: 可能会有所帮助。 (链接:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewDelegate_Protocol/Reference/Reference.html)。

【讨论】:

以上是关于我可以通过减少调用 [CALayer LayoutSubviews] 来使我的 tableview 移动得更流畅,如何?的主要内容,如果未能解决你的问题,请参考以下文章

CALayer - 未调用显示方法

动画期间未调用 CALayer setPosition

CALayer 委托仅在使用 Swift 时偶尔调用

在 -[CALayer setNeedsDisplayInRect:] 中禁用隐式动画

CALayer 的子类 VS 类别

CALayer委托方法drawLayer没有被调用