我试图了解何时覆盖layoutSubviews
和updateConstraints
。
我创建了一个自定义视图,该视图包含其他视图。我尚无法在自定义初始化程序中为视图的子视图设置约束,因为我还不知道自定义视图的框架。
目前我有这个:
-(void)layoutSubviews
{
[super layoutSubviews];
// Add new constraints
}
然后,每当我添加或删除任何子视图时,我都会调用
[self setNeedsLayout];
这是正确的方法吗?每当调用
layoutSubviews
时,我都会重新创建约束。我听说updateConstraints
可能就是我想要的?但是我不确定子视图的数量不会保持恒定,因此约束的数量也不是恒定的。 最佳答案
添加子视图时,应添加约束。您可以单独为每个子视图执行此操作,也可以使用自定义方法(如果可以将其推广)。layoutSubvews
和updateConstraints
方法是回调,它们在布局周期的特定点被调用。特别是,它们被多次调用,并且会自动禁止您使用约束,因为存在创建多个约束的危险。
如documentation所述,layoutSubviews
仅在以下情况下使用
如果子视图的自动调整大小和基于约束的行为没有提供您想要的行为。
如果调用layoutSubviews
,则完成当前的自动布局,并且添加,删除或修改约束可能会重新触发布局过程。这可能会极大降低您的应用速度。updateConstraints
的documentation在您应覆盖它时还包括一条明确的声明:
重写此方法可优化对约束的更改。
更改约束并不意味着添加约束。如果在不同的时间需要不同的视图约束,则可以在运行时 deactivate
未使用和 activate
所需的约束。这可以在updateConstraints
中完成。
顺便说一句:通常不需要setNeedsLayout
的(显式)调用,尤其是在您更改了视图层次结构或布局约束的情况下。