8

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

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

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

自动布局

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

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

固定布局

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

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

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

非常感谢!

4

2 回答 2

5

从自动布局转换为帧将非常耗时,并且给您的性能带来的好处最少。更不用说在 iOS7 中开发时的复杂性了。(在此处查看我的其他答案)。

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

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

另外,请记住,如果您只是更新一个constant. 您可以在上述方法之外做一些事情。

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

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

于 2013-10-25T09:51:17.133 回答
3

据我了解,就我而言,自动布局应该比固定框架慢

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

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

于 2013-10-25T09:16:08.590 回答