求めているものを正確に取得するには、いくつかの特定の制約を指定する必要があります。素朴な試みは次のように始まる可能性があります(次の行は使用しないでください):
[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
。