如何在初始化期间正确设置子视图约束?

how to properly set subview constraints during initialization?

我知道如何设置约束,但我真的需要知道如何正确设置它。

基本上我有一个自定义视图 subclassing UIView,我需要指定约束,例如标签需要始终高于按钮 10pts。

这样的约束条件,我应该在哪里设置呢?现在我在 init 函数中设置约束,我在指定约束后调用 layoutIfNeeded 。但我也读到你应该在 layoutSubviews 中设置约束,但后来我又在某个地方读到它,layoutSubviews 会被调用很多次,所以在那里设置约束真的没有意义。

我也稍微玩了一下 layoutsubviews,我意识到我在 layoutsubviews 中设置的约束对布局根本没有任何影响。到目前为止,我只是通过直接调用 layoutIfNeeded 成功地设置了约束。

我也很好奇,我是只需要设置一次约束还是每次刷新都设置约束?

我这样做对吗?我应该在我的自定义 class 中的什么地方设置约束?

每次刷新时设置约束(例如在 LayoutSubviews 中)会扰乱约束并导致大量不必要的工作。 WWDC 有一个很棒的话题,高性能自动布局。

https://developer.apple.com/videos/play/wwdc2018/220

但通常使用 Interface Builder 会让您远离自己;也就是说,系统会在 View 生命周期的适当时间处理添加约束。

如果您必须以编程方式添加约束,那么将它们添加到初始化程序中并调用 layoutIfNeeded() 是一个很好的解决方案。