AutoLayout:在可以调整大小的超级视图中垂直居中两个UIView

时间:2013-07-11 16:06:18

标签: iphone ios autolayout

我有两个UIButton,一个在另一个的顶部,在superview中,其高度可以调整大小。两个按钮之间应该有一个恒定的垂直间距,但是顶部和底部的间距应该调整大小,以便在调整大小时两个按钮在superview中保持居中。

我尝试在每个按钮的superview的间距上创建两个小于或等于的约束(具有相同的优先级),以及按钮之间的恒定垂直间距,如下所示: enter image description here

(之所以它在这里小于或等于是因为这个视图在IB的4英寸屏幕的给定高度定义,但是可以缩小为3.5英寸的屏幕。)但是,这不做这个技巧,正如您在应用程序运行时从屏幕截图中看到的那样: enter image description here

这几乎就像你想告诉AutoLayout这两个约束本身应该具有相等的值,即使它们都被设置为“小于或等于”。有没有办法做我想做的事情,或者更好的方式?

4 个答案:

答案 0 :(得分:14)

这在IB中是如此微不足道。

1)^从button1拖到顶部。选择“在容器中水平居中”。

2)^从button1拖到左边。选择“在容器中垂直居中”。

3)使用button2执行相同操作。

4)现在唯一要做的就是调整按钮的大小,因为这就是它的样子。

enter image description here

这也非常简单。

5)^从button1向左拖动。选择“领先空间到容器边际”。

6)^从button1向右拖动。选择“尾随空间到容器边距”。

7)用button2完成同样的事情。

成品看起来像这样(注意我并没有把它们放在中心位置,但我可以轻松地完成它):

enter image description here

enter image description here

答案 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中,并将该视图置于控制器视图的中心。将按钮与此视图的顶部和底部保持固定距离,并在它们之间保持固定距离,或者为视图固定高度。