我正在使用单元格的自动布局(UITableViewCell和UICollectionViewCell),但是当重复使用单元格时,我注意到了显着的性能缺陷,我想知道如何改进它。
也许是因为我创建/配置单元格的方式,在我的应用程序中我需要将书籍显示为单元格,不同的书籍类型有不同的布局,但我只有一个BookCell,我在单元格时重新配置约束根据书籍的类型创建/重用特定书籍。
根据我的理解,在我的情况下,自动布局应该比固定帧慢,因为步骤如下:
自动布局
我认为在第2步内部iOS将重新运行约束求解器,并且在步骤3将重新调整约束(即重新运行求解器)以满足所有设置了文本和图像的标签和图像视图。
固定布局的
(有标签,图像视图,不同类型的不同帧列表) 1.重新设置所有标签',图像视图'的框架 2.设置标签的文本和图像视图图像
我需要一些时间来将所有自动布局单元转换为使用固定框架,我能想到的是为了提高性能:
updateConstraints
方法或初始值设定项(例如initWithTableViewCellStyle:reusableIdentifier:
)中添加自动布局约束吗?非常感谢!
答案 0 :(得分:4)
从自动布局转换为帧将非常耗时,并且性能最低。在iOS7中开发时更不用说并发症了。 (请参阅我对here).
的其他答案正如Kugler的study所示,自动布局应该足够快。不要忘记,框架或自动布局,这一切都归结为数学计算,现代CPU非常擅长。
在你的情况下,我会建议采用不同的方法。首先,检查您是否正确操作约束,并在正确的位置。这意味着updateConstraints
和updatedViewConstraints
。添加或删除约束是一项昂贵的操作。但实际上,你应该只通过这些方法在视图创建上做一次。不要忘记检查是否已经创建了约束,这样就不会通过重复添加来获得异常。
另外,请记住,如果您只是更新constant
,则无需添加或删除约束。除了上述方法之外你可以做的事情。
接下来,考虑表视图发生了什么。它滚动得很快,cellForRowAtIndexPath
要求下一个单元格。在你的情况下,细胞看起来都很不一样。要解决此问题,请为每个变体使用不同的reuseIdentifier
。
只要您填充单元格的数据操作很少,您可能会在初始单元格创建时看到一点点不寒而栗。但是,此后滚动应该非常顺利。
答案 1 :(得分:2)
根据我的理解,在我的情况下,自动布局应该慢于 固定框架
自动布局几乎总是更慢。但在大多数情况下,使用自动布局和固定布局之间的区别应该不明显。
如果您只有五种不同的类型,则可以为每种类型/布局使用不同的唯一单元格重用标识符。每次出列操作后,它都不需要添加/删除约束。有关详细信息,请参阅此优秀答案:https://stackoverflow.com/a/18746930/1990236