我有一个包含两个子视图的内容视图。我已垂直堆叠子视图并将其水平居中(x轴)在内容视图中:
[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[buttonView]-[label]" options:NSLayoutFormatAlignAllCenterX metrics:nil views:NSDictionaryOfVariableBindings(buttonView, label)]];
现在我想垂直居中(Y轴)。我想从buttonView的顶部和标签视图的底部获得相等的空间。
我该怎么做?有优先权的顶部和底部约束?
编辑:
Scott,以下是您建议的代码的外观:
我尝试在buttonView和标签-1-
之间设置间距,但没有帮助。
这就是我需要它的样子:
以下是我用来实现它的代码:
[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-13-[buttonView]-[label]-10-|" options:NSLayoutFormatAlignAllCenterX metrics:nil views:NSDictionaryOfVariableBindings(buttonView, label)]];
我的约束工作,但是硬编码我宁愿远离,如果可能的话。
答案 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。这会产生以下输出:
作为比较,这里只是在这个应用程序中使用你的原始约束(这就是为什么我认为NSLayoutAlignAllCenterX
没有进行居中):
我想知道你的按钮是否还有更多(是自定义类吗?)和contentView
。