为了得到你所要求的精确内容,你需要指定一些具体的限制条件。一个天真的尝试可能会从以下行开始(不要使用以下行):
[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和一个添加到视图中的按钮和标签。 查看gist中的代码。这会产生以下输出:
![Example app with my constraints](https://istack.dev59.com/e5ljC.webp)
作为比较,这里只是在此应用程序中使用您的原始约束(这就是我认为
NSLayoutAlignAllCenterX
没有进行居中对齐的原因):
![Example app with questioner's constraints](https://istack.dev59.com/m4D5N.webp)
我想知道你的按钮是否有更多的功能(它是自定义类吗?)以及
contentView
。