建立有效的布局

关于iOS,我们大多数人已经使用AutoLayout在UI中定位内容已有相当长的时间了。 但是我们是否曾经考虑过有效使用它,或者您多么容易使UI变得如此复杂而导致丢失帧。 当我们以编程方式添加约束时,这更适用。

渲染循环

大多数应用的目标帧率为60 FPS,相当于每帧16.67毫秒。 渲染循环是每秒可能运行120次的过程。 这样可以确保所有内容都准备好用于每个帧。 渲染循环分为三个阶段。

1.计算约束

从叶的大多数视图一直到窗口的视图层次结构。

2.布局视图

从窗户向下朝树叶开始,这是相反的方向。

3.显示/绘制

这也从窗口开始朝着叶子的方向相反。

避免约束搅动

当您不必要地更新约束但并非所有子视图都需要重新渲染时,就会发生搅动。 这将为布局引擎增加其他工作,从而导致渲染循环中花费更多时间。 下面的示例演示如何避免使用非常简单的方法重新计算静态约束。

激活约束

激活约束后,将创建一个方程式,布局引擎将对其求解以获取minX,minY,宽度和高度。 在布局阶段,此帧数据将从布局引擎提供给视图,并且将相应调整每个视图的大小和位置。

对于具有静态位置的视图,而不是激活停用一组约束的方法,请尝试查找是否可以使用setHidden和hide / show以避免布局引擎和布局阶段的额外开销。

内在内容大小

具有非视图内容的视图将基于该非视图内容返回其固有内容大小的大小。 这方面的两个示例是UIImageView和UILabel,UIImageView使用其图像的大小来计算其内部内容的大小,UILabel测量其文本并使用其返回其内部内容的大小。 这用于创建大小约束。

文本测量可能很昂贵。 因此,如果您的应用程序是文本密集型应用程序,并且如果您知道文本所需的大小而无需进行所有文本度量,那么您可以返回该大小和固有内容大小,或者如果您打算放置此视图在屏幕上,无论其中的文本大小如何,约束都将完全定义大小。 例如,约束总是会使它大于您所拥有的文本量。

systemLayoutSizeFittingSize

这用于从布局引擎获取尺寸信息。 尝试将其使用量降到最低,尤其是在表格或集合单元格内部,因为这可能会对滚动性能产生不利影响。 调用此方法将创建一个布局引擎,并将约束添加到此引擎,解决布局,然后返回顶视图框架的大小,然后丢弃该引擎。

因此,总的来说,性能影响是线性的,取决于您添加的约束。 约束越复杂,求解这些方程式以及渲染循环中的后续阶段所花费的时间就越多。 布局引擎是一个缓存和一个依赖项跟踪器,因此已经解决的值将存在于缓存中,并且相对于此添加新约束将很快。

设置其他参数(例如约束优先级)将花费更多时间来计算,建议除非您确实需要它们,否则不要过多使用它。