要准确获得所需的内容,您需要指定一些特定的约束。一个天真的尝试可能从(不要使用以下行)开始:
[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
.