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