3

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

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

现在我想将它们垂直居中(y 轴)。我希望 buttonView 顶部和标签视图底部的空间相等。

我怎样才能做到这一点?具有优先级的顶部和底部约束?

编辑:

斯科特,这是您建议的代码的外观:

buttonView 太高了

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

在此处输入图像描述

这是我用来实现它的代码:

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

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

4

1 回答 1

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,因为此时它没有做任何有意义的事情,并且实际上并没有将视图与超级视图的中心 X 对齐,只是彼此对齐。

编辑:

我做了一个简单的示例应用程序,它有一个 ViewController 和一个添加到视图的按钮和标签。将代码视为要点。这会产生以下输出:

带有我的约束的示例应用程序

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

带有提问者约束的示例应用

我想知道您的按钮是否还有更多功能(它是自定义类吗?)和contentView.

于 2013-01-25T23:20:41.780 回答