我有两个UIButton,一个在另一个的顶部,在superview中,其高度可以调整大小。两个按钮之间应该有一个恒定的垂直间距,但是顶部和底部的间距应该调整大小,以便在调整大小时两个按钮在superview中保持居中。
我尝试在每个按钮的superview的间距上创建两个小于或等于的约束(具有相同的优先级),以及按钮之间的恒定垂直间距,如下所示:
(之所以它在这里小于或等于是因为这个视图在IB的4英寸屏幕的给定高度定义,但是可以缩小为3.5英寸的屏幕。)但是,这不做这个技巧,正如您在应用程序运行时从屏幕截图中看到的那样:
这几乎就像你想告诉AutoLayout这两个约束本身应该具有相等的值,即使它们都被设置为“小于或等于”。有没有办法做我想做的事情,或者更好的方式?
答案 0 :(得分:14)
这在IB中是如此微不足道。
1)^从button1拖到顶部。选择“在容器中水平居中”。
2)^从button1拖到左边。选择“在容器中垂直居中”。
3)使用button2执行相同操作。
4)现在唯一要做的就是调整按钮的大小,因为这就是它的样子。
这也非常简单。
5)^从button1向左拖动。选择“领先空间到容器边际”。
6)^从button1向右拖动。选择“尾随空间到容器边距”。
7)用button2完成同样的事情。
成品看起来像这样(注意我并没有把它们放在中心位置,但我可以轻松地完成它):
答案 1 :(得分:7)
垂直居中的最简单方法是添加NSLayoutAttributeCenterY
约束 - 最好是靠近视图中心的元素。如果所有视图都有垂直间距约束,那么它们都将居中。无需查看视图层次结构或添加间隔视图。
[self.view addConstraint:
[NSLayoutConstraint constraintWithItem:button2
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeCenterY
multiplier:1.0
constant:0]];
如果需要调整定位,请设置常量。例如:constant:-30
会将其提升30点。
您还可以根据视图的不同逻辑区域来锚定元素。例如,如果您想将第一个按钮锚定在视图高度的25%处,则可以将乘数设置为0.5
。
答案 2 :(得分:4)
同意rdelmar。如果您想保留视图层次结构,这是另一个选项。
您目前使用约束来区分顶部和底部的按钮。相反,创建两个空的UIView
,它们将用作间隔符。它们应位于按钮顶部和底部的一个位置。使用自动布局约束,确保这两个间隔视图的高度始终相等。确保它们分别固定在按钮的顶部和底部以及超视图的顶部和底部。
在VFL:V:|-[spacer1(==spacer2)]-[button1]-(20)-[button2]-[spacer2(==spacer1)]-|
。
您可能必须在代码中执行此操作,我不确定IB是否可以执行此操作。
答案 3 :(得分:2)
实现此目的的一种方法是将两个按钮括在另一个UIView中,并将该视图置于控制器视图的中心。将按钮与此视图的顶部和底部保持固定距离,并在它们之间保持固定距离,或者为视图固定高度。