改善您的自动版式游戏。
它是如何工作的?
为了使自动版式的性能更好,我们首先需要了解其在引擎盖下的工作方式。
当您指定约束时,它们将传递到布局引擎,然后由布局引擎计算视图的适当大小和位置属性。 关系越复杂,计算所需的时间就越多。 但是稍后会更多。
在那之后,引擎告诉系统在屏幕更新后要考虑新的布局约束。
1.约束阶段从层次结构中最接近的视图到最远的视图(例如,从叶子到根)按顺序计算布局。
2.布局阶段调用方法的顺序相反。 在该阶段,所有视图均根据约束条件进行适当布局,并设置框架。
3.最后一个领域是更新屏幕。
自动布局问题。
1.多次创建约束。
如今,这是最不常见的错误。 过去,程序员倾向于在updateConstraints方法中创建约束,这会导致引擎每帧再次重新计算约束。
解:
设置视图内容后立即将布局代码置于视图初始化中的常见位置,或者在需要时创建一个标志以在updateConstraints
方法中使用。
解:
上)
如果视图的约束与视图的直接同级和祖先相关,则引擎可以执行线性时间复杂度的计算,如下所示。
3.不必要的限制
当您有一些当前在屏幕上不可见的视图时,您无需关心它们的布局,因此我们可以减轻布局引擎的障碍。
解:
最有效的方法是将视图属性isHidden
设置为true
并停用约束。
我将使用不同的框架设置这种简单的布局,以演示语法和逻辑。
视觉格式语言
NSLayoutConstraint类
布局锚
解:
您可以使用第三方DSL(用于自动布局的包装器)扩展自动布局,对我而言,它们比Apple提供的更好。
SnapKit
品纳
制图学
5.难以调试
一直很难确定约束出了什么问题,尤其是在布局复杂的情况下。 现在,由于调试器变得非常聪明,它会变得容易得多,它会告诉您是否有问题。 而且,如果您使用情节提要板,则会出现警告,以防止您放置多余的/冲突的约束。
不是解决方案,而是提示:
您可以将SymbolicBreakpoint
与UIViewAlertForUnsatisfiableConstraints
符号一起添加。
它将使用汇编代码停止执行,您可以在其中转储通过在控制台po $rbx
打印而破坏的视图和约束数组,或使用po $r14
获取更多信息。
如果要查看有关所有子视图和特定视图约束的信息,请使用po .recursiveDescription
(可能需要unsafeBitcast(_:)
放到UIView.self
)
但是,还有更多:
如果要向自动布局发出信号,则视图需要一定的空间来容纳其内容,类似于UILabel
和UIImageView
。 您可以覆盖intrinsicContentSize
。
我希望我弄清楚了这个主题,对它有所帮助。
在下一篇文章中,我将介绍最佳的替代布局引擎,以及如何制作自己的,敬请期待🙂