3

2つのサブビューを持つコンテンツビューがあります。サブビューを垂直方向に積み重ね、コンテンツビューで水平方向(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 に答える