繁体   English   中英

如何使用Auto Layout在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;

您可以使用“自动布局约束”工具来简化此过程。

自动布局是关于始终保持规则的规则,而不是(主要)关于任何时刻的帧大小。

设置按钮5和6的约束时,您不必关心获取按钮4的框架。为按钮5和6添加的约束应参考按钮4的width属性,而不是其当前的宽度(以磅为单位)。 也就是说,您可以创建如下约束:

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对容器(或其边缘)具有尾随的空间约束,因此在添加按钮5和6时需要删除这些约束。按钮2和4必须具有尾随的空间。分别对按钮5和6进行约束,而按钮5和6必须对容器具有尾随约束。 实际上,您应该简化操作,方法是摆脱对容器的按钮4的尾随约束,并用对按钮2的尾随对齐约束替换它。同样,按钮6的尾随边缘应与按钮5的尾部对齐,且与超级视图之间的距离不要隔开。 这样,您只需删除一个约束(按钮2的尾部到超级视图)并添加一个约束(按钮5的尾部到超级视图)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM