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

iOS: Adding new constraints in a custom view the rely on the view's frame

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

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

目前我有这个:

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

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

这是执行此操作的正确方法吗?每当 layoutSubviews 被调用时,我目前正在重新创建约束。我听说 updateConstraints 可能是我想要的?但是我不确定,因为子视图的数量不会保持不变,因此,约束的数量也不会保持不变。

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

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

documentation 所述,layoutSubviews 仅应在

时使用

if the autoresizing and constraint-based behaviors of the subviews do not offer the behavior you want.

如果调用layoutSubviews,则当前自动布局完成,添加、删除或修改约束可能re-trigger布局过程。这可能 slow-down 您的应用程序非常。

updateConstraintsdocumentation 还包含一个明确的声明,说明何时应该覆盖它:

Override this method to optimize changes to your constraints.

对约束的更改并不意味着添加约束。如果您在不同时间需要不同的视图约束,您可能 deactivate unused and activate 在运行时需要约束。这可以在 updateConstraints.

中完成

顺便说一句:setNeedsLayout 的(显式)调用通常是不必要的,尤其是当您更改了视图层次结构或布局约束时。