【问题标题】:iOS *Cell Performance: Autolayout vs Frame?iOS *Cell 性能:自动布局与框架?
【发布时间】:2013-11-02 14:59:28
【问题描述】:

我正在对单元格(UITableViewCell 和 UICollectionViewCell)使用自动布局,但注意到重新使用单元格时会出现明显的性能缺陷,我想知道我可以做些什么来改进它。

也许是因为我创建/配置单元格的方式,在我的应用程序中我需要将书籍显示为单元格,不同的书籍类型有不同的布局,但我只有一个 BookCell,我在单元格时重新配置约束根据书的类型为特定书创建/重用。

据我了解,在我的情况下,自动布局应该比固定框架慢,步骤如下:

自动布局

  1. 移除当前限制
  2. 根据图书类型重新添加约束
  3. 设置图书的所有标签/图像视图

我认为在内部,iOS 将在第 2 步重新运行约束求解器,并在第 3 步重新调整约束(即重新运行求解器)以满足所有带有文本和图像集的标签和图像视图。

固定布局

(具有标签、图像视图、不同类型的不同框架列表) 1.重新设置所有标签',图像视图'框架 2.设置标签的文本和图像视图的图像

我需要一些时间来将所有自动布局单元格转换为使用固定帧,为了提高性能,我能想到的事情是:

  1. 复制通用 BookCell,并为每种类型制作一个单元格。
  2. 设置所有标签、图像视图、之前设置约束
  3. 对此不太确定,我应该在updateConstraints 方法或初始化程序中添加自动布局约束(例如initWithTableViewCellStyle:reusableIdentifier:)吗?

非常感谢!

【问题讨论】:

  • 你有多少种书籍类型?

标签: ios objective-c uitableview uicollectionview autolayout


【解决方案1】:

从自动布局转换为框架将非常耗时,并且对性能的影响最小。更不用说在 iOS7 中开发时的复杂性了。 (请参阅我在此here). 上的其他答案

正如 Kugler 的 study 所示,自动布局应该足够快。不要忘记,帧或自动布局,这一切都归结为数学计算,现代 CPU 非常擅长。

在你的情况下,我会推荐一种完全不同的方法。首先,检查您是否在正确的位置正确地操作约束。这意味着updateConstraintsupdatedViewConstraints。添加或删除约束是一项昂贵的操作。但实际上,您应该只在视图创建时通过这些方法执行一次。不要忘记检查约束是否已经创建,以免重复添加时出现异常。

另外,请记住,如果您只是更新constant,则无需添加或删除约束。您可以在上述方法之外做一些事情。

接下来,考虑一下表格视图发生了什么。它滚动得很快,cellForRowAtIndexPath 正在请求下一个单元格。在你的情况下,细胞看起来都非常不同。要解决这个问题,请为每个变体使用不同的 reuseIdentifier

只要填充单元格的数据操作是最小的,您可能会在初始单元格创建时看到轻微的颤抖。但是,此后滚动应该非常流畅。

【讨论】:

    【解决方案2】:

    据我了解,在我的情况下,自动布局应该比 固定框架

    自动布局几乎总是较慢。但在大多数情况下,使用自动布局和固定布局之间的差异并不明显。

    如果您只有五种不同的类型,则可以为每种类型/布局使用不同的唯一单元重用标识符。它将消除每次出队操作后添加/删除约束的需要。有关更多信息,请参阅这个很好的答案:https://stackoverflow.com/a/18746930/1990236

    【讨论】:

    • 进一步解释:如果您将约束添加到单元格并显示它,然后稍后尝试将同一单元格重用于一组完全不同的约束,您将遇到可怕的性能问题。原因是内部约束求解器已经求解了您的约束(线性方程),并且假设在您进行进一步更改时修改现有解决方案会更快,而不是从头开始并重新求解它们全部。在这种情况下,这是错误的策略,因此您只能避免大量消除约束。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多