使用约束在内容视图中居中的子视图

时间:2013-01-25 21:05:39

标签: ios objective-c autolayout nslayoutconstraint

我有一个包含两个子视图的内容视图。我已垂直堆叠子视图并将其水平居中(x轴)在内容视图中:

[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[buttonView]-[label]" options:NSLayoutFormatAlignAllCenterX metrics:nil views:NSDictionaryOfVariableBindings(buttonView, label)]];

现在我想垂直居中(Y轴)。我想从buttonView的顶部和标签视图的底部获得相等的空间。

我该怎么做?有优先权的顶部和底部约束?

编辑:

Scott,以下是您建议的代码的外观:

The buttonView is too far up

我尝试在buttonView和标签-1-之间设置间距,但没有帮助。 这就是我需要它的样子:

enter image description here

以下是我用来实现它的代码:

[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-13-[buttonView]-[label]-10-|" options:NSLayoutFormatAlignAllCenterX metrics:nil views:NSDictionaryOfVariableBindings(buttonView, label)]];

我的约束工作,但是硬编码我宁愿远离,如果可能的话。

1 个答案:

答案 0 :(得分:6)

要准确了解您所要求的内容,您需要指定一些特定的约束。天真的尝试可能以(不要使用以下行)

开头
[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[buttonView]-[label]-|" options:NSLayoutFormatAlignAllCenterX metrics:nil views:NSDictionaryOfVariableBindings(buttonView, label)]];

但这导致按钮和标签被拉伸以满足约束。所以,让我们告诉系统我们想要什么。我们将从您的代码开始,因为这给了我们一个基本的对齐。

[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[buttonView]-[label]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(buttonView, label)]];
[contentView addConstraint:[NSLayoutConstraint constraintWithItem:buttonView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:contentView attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:-4.0]];
[contentView addConstraint:[NSLayoutConstraint constraintWithItem:button attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:contentView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]];
[contentView addConstraint:[NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:contentView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]];

4.0来自哪里?它是默认子视图间距-(8)的一半,将底部与中心Y对齐,但稍微向上以使中间线对齐。

另外,你会注意到我删除了NSLayoutFormatAlignAllCenterX,因为此时它没有做任何有意义的事情,并且实际上并没有将视图与superview的中心X对齐,只是彼此对齐。 / p>

编辑:

我制作了一个简单的示例应用程序,它有一个ViewController,一个按钮和标签添加到视图中。 See the code as a gist。这会产生以下输出:

Example app with my constraints

作为比较,这里只是在这个应用程序中使用你的原始约束(这就是为什么我认为NSLayoutAlignAllCenterX没有进行居中):

Example app with questioner's constraints

我想知道你的按钮是否还有更多(是自定义类吗?)和contentView