如何在具有自动布局的 Interface Builder 中创建的现有视图中添加视图?

How to add views in an existing view made in Interface Builder with Auto Layout?

我在 Interface Builder 中创建了以下自动布局:

如您所见,我没有为按钮提供任何固定大小。我想以编程方式添加两个按钮以获得此结果:

以编程方式添加约束我知道怎么做,至少我知道语法。

我的问题是什么时候创建这些按钮?

我根据按钮 4 的宽度创建宽度约束。如果我在 viewDidLoad 中这样做(如果我没记错的话),自动布局尚未设置,所以宽度(和高度)会错的。

我想在 viewDidLayoutSubviews 中执行此操作,但由于在加载 viewController 时多次调用它,我得到多个按钮彼此堆叠,当我进入横向时添加了更多按钮..

我应该在什么时候创建这些按钮以使其具有正确的尺寸?

您可以在 viewDidLoad 中以编程方式创建约束。如果你为按钮制作了一个 IBOutlet,那么你可以访问它们并获得这样的大小:

self.myButton.frame.size.height;

您可以使用 Autolayout Constraints 工具来简化此过程。

自动布局是关于始终适用的规则,而不是(主要)关于任何时刻的框架大小。

在为按钮 5 和 6 设置约束时,您不应该关心按钮 4 的框架。您为按钮 5 和 6 添加的约束应参考按钮 4 的宽度属性,而不是其当前宽度分。也就是说,您可以创建这样的约束:

NSLayoutConstraint* constraint = [NSLayoutConstraint constraintWithItem:button5 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:button4 attribute:NSLayoutAttributeWidth multiplier:1 constant:0];
constraint.active = YES; // OR: [button5.superview addConstraint:constraint]

即使按钮 4 的宽度发生变化,该约束也会使按钮 5 的宽度与按钮 4 的宽度保持相同。您可以对高度和按钮 6 等执行相同的操作。

换句话说,您在运行时创建的约束应该类似于您在设计时在 IB 中创建的约束。在我看来,您并没有在按钮 4 上创建明确的、固定的高度和宽度约束。您已经创建了将其高度和宽度与其他视图相关联的相对约束。

您必须做的一件事:由于按钮 2 和 4 对容器(或其边距)具有尾随 space 约束,因此您需要在添加按钮 5 和 6 时删除这些约束。按钮 2 和 4 必须分别对按钮 5 和 6 具有尾随约束,而按钮 5 和 6 必须对容器具有尾随约束。实际上,您应该通过取消按钮 4 对容器的尾部约束并将其替换为按钮 2 的尾部对齐约束来进行简化。同样,按钮 6 的后缘应与按钮 5 对齐,而不是 spaced 从监督的。这样一来,您只需要删除一个约束(按钮 2 落后于 superview)并添加一个(按钮 5 落后于 superview)。