iOS *Cell性能:自动布局与框架?

8
我正在为单元格(UITableViewCell和UICollectionViewCell)使用自动布局,但是发现当单元格被重用时有明显的性能损失,我想知道我该怎么做才能改善它。也许是因为我创建/配置单元格的方式不对,在我的应用程序中,我需要将书籍显示为单元格,不同的书籍类型有不同的布局,但我只有一个BookCell,我会根据书籍的类型在创建/重用特定的书籍时重新配置约束。
据我所知,在我的情况下,自动布局应该比固定框架慢,因为步骤如下:
自动布局
1. 删除当前约束 2. 根据书籍类型重新添加约束 3. 设置书籍的所有标签/图像视图
我认为在步骤2内部,iOS将重新运行约束求解器,并在步骤3中重新调整约束(即重新运行求解器)以满足设置了文本和图像的所有标签和图像视图。
固定布局
(对于不同的流派有一个标签、图像视图的不同帧列表) 1. 重新设置所有标签、图像视图的帧 2. 设置标签的文本和图像视图的图像
转换所有自动布局单元格以使用固定框架需要一些时间,我能想到的改善性能的方法是:
1. 复制通用的BookCell,并为每种流派制作一个单元格。 2. 在设置约束之前设置所有标签、图像视图 3. 不太确定,我应该在updateConstraints方法中添加自动布局约束,还是在初始化程序(例如initWithTableViewCellStyle:reusableIdentifier:)中添加?
非常感谢!

你有多少本书的类型? - Arek Holko
2个回答

6
从自动布局转换到框架将耗费时间,而且性能收益最小。更不用说在iOS7开发时会出现复杂情况。(参见我在这里的其他回答)。
正如Kugler的研究所显示的那样,自动布局应该足够快。别忘了,无论是框架还是自动布局,所有的计算都归结为数学计算,这是现代CPU非常擅长的事情。
对于你的情况,我建议采取一种完全不同的方法。首先,请确保你正确地操作约束,并在正确的位置上进行操作。也就是说,通过updateConstraintsupdatedViewConstraints方法只在视图创建时执行一次添加或删除约束操作,因为这是一项昂贵的操作。别忘了检查约束已经被创建,以免重复添加导致异常。
同时,请记住,如果您只是更新常量,则不需要添加或删除约束。这是可以在上述方法之外完成的。
接下来,考虑一下表格视图中发生了什么。它正在快速滚动,cellForRowAtIndexPath正在请求下一个单元格。在您的情况下,所有单元格看起来都非常不同。为解决这个问题,为每个变化使用不同的reuseIdentifier
只要填充单元格的数据操作很小,您可能会在初始单元格创建时看到微小的颤动。然而,在那之后,滚动应该非常平滑。

3

据我所知,在我的情况下,自动布局应该比固定框架慢。

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

如果您只有五种不同的类型,可以为每个类型/布局使用不同的唯一单元格重用标识符。这将消除每次出列操作后添加/删除约束的需要。有关更多信息,请参见此优秀答案:https://dev59.com/4WMl5IYBdhLWcg3wCDGW#18746930


5
进一步解释:如果您向单元格添加约束并显示它,然后尝试稍后重复使用该单元格以适用于完全不同的一组约束,则会遇到严重的性能问题。原因是内部约束求解器已经解决了您的约束(线性方程),并且构建时假定修改现有解决方案以进行进一步更改比从头开始重新解决所有问题更快。在这种情况下,这是错误的策略,因此除了避免大量删除约束之外,没有其他办法。 - smileyborg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接