iOS * Cell性能:Autolayout vs Frame?

时间:2013-10-24 04:19:40

标签: ios objective-c uitableview uicollectionview autolayout

我正在使用单元格的自动布局(UITableViewCell和UICollectionViewCell),但是当重复使用单元格时,我注意到了显着的性能缺陷,我想知道如何改进它。

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

根据我的理解,在我的情况下,自动布局应该比固定帧慢,因为步骤如下:

自动布局

  1. 删除当前约束
  2. 根据图书的流派重新添加约束
  3. 设置图书的所有标签/图片视图
  4. 我认为在第2步内部iOS将重新运行约束求解器,并且在步骤3将重新调整约束(即重新运行求解器)以满足所有设置了文本和图像的标签和图像视图。

    固定布局的

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

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

    1. 复制通用BookCell,并为每个类型创建一个单元格。
    2. 设置所有标签,图片视图, 设置约束
    3. 之前
    4. 对此不太确定,我应该在updateConstraints方法或初始值设定项(例如initWithTableViewCellStyle:reusableIdentifier:)中添加自动布局约束吗?
    5. 非常感谢!

2 个答案:

答案 0 :(得分:4)

从自动布局转换为帧将非常耗时,并且性能最低。在iOS7中开发时更不用说并发症了。 (请参阅我对here).

的其他答案

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

在你的情况下,我会建议采用不同的方法。首先,检查您是否正确操作约束,并在正确的位置。这意味着updateConstraintsupdatedViewConstraints。添加或删除约束是一项昂贵的操作。但实际上,你应该只通过这些方法在视图创建上做一次。不要忘记检查是否已经创建了约束,这样就不会通过重复添加来获得异常。

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

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

只要您填充单元格的数据操作很少,您可能会在初始单元格创建时看到一点点不寒而栗。但是,此后滚动应该非常顺利。

答案 1 :(得分:2)

  

根据我的理解,在我的情况下,自动布局应该慢于   固定框架

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

如果您只有五种不同的类型,则可以为每种类型/布局使用不同的唯一单元格重用标识符。每次出列操作后,它都不需要添加/删除约束。有关详细信息,请参阅此优秀答案:https://stackoverflow.com/a/18746930/1990236