iOS:在自定义视图中添加新约束依赖于视图的框架

时间:2018-04-09 21:57:26

标签: ios objective-c autolayout nslayoutconstraint layoutsubviews

我正在尝试了解何时覆盖layoutSubviewsupdateConstraints

我创建了一个自定义视图,该视图包含其他视图。我无法在自定义初始化程序中为视图的子视图设置约束,因为我还不知道自定义视图的框架。

目前我有这个:

-(void)layoutSubviews
{
    [super layoutSubviews];
    // Add new constraints
}

然后每当我添加或删除任何子视图时,我都会调用[self setNeedsLayout];

这是正确的方法吗?我正在重新调用layoutSubviews时调用约束。我听说updateConstraints可能是我想要的?但我不确定子视图的数量是否保持不变,因此,约束的数量也不会保持不变。

1 个答案:

答案 0 :(得分:1)

添加子视图时应添加约束。您可以单独为每个子视图执行此操作,也可以在自定义方法中执行此操作(如果可以推广)。

方法layoutSubvewsupdateConstraints是回调,它们在布局周期的特定点调用。特别是,它们被多次调用,并且会自动禁止您使用约束,因为存在多次创建约束的危险。

正如documentation所述,layoutSubviews只应在

时使用
  

如果子视图的自动调整大小和基于约束的行为不提供您想要的行为。

如果调用了layoutSubviews,则会完成当前的自动布局,添加,删除或修改约束可能会重新触发布局过程。这可能会极大地降低您的应用速度。

updateConstraints updateConstraints还包含一个明确的声明,当你应该覆盖它时:

  

重写此方法以优化对约束的更改。

对约束的更改并不意味着添加约束。如果您在不同时间需要不同的视图约束,那么在运行时可能会documentation未使用和deactivate所需的约束。这可以在setNeedsLayout中完成。

BTW:{{1}}的(显式)调用通常是不必要的,特别是如果您更改了视图层次结构或布局约束。