改善您的自动版式游戏。

它是如何工作的?

为了使自动版式的性能更好,我们首先需要了解其在引擎盖下的工作方式。

当您指定约束时,它们将传递到布局引擎,然后由布局引擎计算视图的适当大小和位置属性。 关系越复杂,计算所需的时间就越多。 但是稍后会更多。

在那之后,引擎告诉系统在屏幕更新后要考虑新的布局约束。

1.约束阶段从层次结构中最接近的视图到最远的视图(例如,从叶子到根)按顺序计算布局。

2.布局阶段调用方法的顺序相反。 在该阶段,所有视图均根据约束条件进行适当布局,并设置框架。

3.最后一个领域是更新屏幕。

自动布局问题。

1.多次创建约束。

如今,这是最不常见的错误。 过去,程序员倾向于在updateConstraints方法中创建约束,这会导致引擎每帧再次重新计算约束。

解:

设置视图内容后立即将布局代码置于视图初始化中的常见位置,或者在需要时创建一个标志以在updateConstraints方法中使用。

解:

上)

如果视图的约束与视图的直接同级和祖先相关,则引擎可以执行线性时间复杂度的计算,如下所示。

3.不必要的限制

当您有一些当前在屏幕上不可见的视图时,您无需关心它们的布局,因此我们可以减轻布局引擎的障碍。

解:

最有效的方法是将视图属性isHidden设置为true并停用约束。

我将使用不同的框架设置这种简单的布局,以演示语法和逻辑。

视觉格式语言

NSLayoutConstraint类

布局锚

解:

您可以使用第三方DSL(用于自动布局的包装器)扩展自动布局,对我而言,它们比Apple提供的更好。

SnapKit

品纳

制图学

5.难以调试

一直很难确定约束出了什么问题,尤其是在布局复杂的情况下。 现在,由于调试器变得非常聪明,它会变得容易得多,它会告诉您是否有问题。 而且,如果您使用情节提要板,则会出现警告,以防止您放置多余的/冲突的约束。

不是解决方案,而是提示:

您可以将SymbolicBreakpointUIViewAlertForUnsatisfiableConstraints符号一起添加。

它将使用汇编代码停止执行,您可以在其中转储通过在控制台po $rbx打印而破坏的视图和约束数组,或使用po $r14获取更多信息。

如果要查看有关所有子视图和特定视图约束的信息,请使用po .recursiveDescription (可能需要unsafeBitcast(_:)放到UIView.self

但是,还有更多:

如果要向自动布局发出信号,则视图需要一定的空间来容纳其内容,类似于UILabelUIImageView 。 您可以覆盖intrinsicContentSize

我希望我弄清楚了这个主题,对它有所帮助。

在下一篇文章中,我将介绍最佳的替代布局引擎,以及如何制作自己的,敬请期待🙂