4

私は2つのラベルを持っています。どちらかが動いたら両方動かせるようにしたいです。それらを NSLayoutConstraints と一緒に「アタッチ」するにはどうすればよいですか? IB でこれを行うことができますが、コードで行う必要があります。

また、NSLayoutAttributeBaseline、NSLayoutAttributeLeading、および NSLayoutAttributeTrailing とは何ですか?

編集:

センタリング poweredByLabel (別名 label02):

[constraints addObject:[NSLayoutConstraint constraintWithItem:poweredByLabel
                                                    attribute:NSLayoutAttributeCenterX
                                                    relatedBy:NSLayoutRelationEqual
                                                       toItem:myImage
                                                    attribute:NSLayoutAttributeCenterX
                                                   multiplier:1.0
                                                     constant:0]];

ラベルを積み重ねて垂直に切り替えます。

[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[rememberPasswordSwitch]-10-[rememberPasswordLabel]-10-[versionLabel]-[poweredByLabel]-|"
                                                                         options:NSLayoutFormatAlignAllBaseline
                                                                         metrics:nil
                                                                           views:viewsDictionary]];

エラーが発生します:

*キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。V:[rememberPasswordSwitch]-10-[rememberPasswordLabel]-10-[versionLabel]-[poweredByLabel]-|...................................................... ................................................................... ...................^'

NSLayoutFormatAlignAllBaseline オプションを指定しないと、正常に実行されます (スタックされますが、すべてが水平方向に中央揃えされるわけではありません)。

4

1 に答える 1

7

コードでこれを行う必要がある場合は、まず NSLayoutConstraint を作成してから、制約をラベルのスーパービューに追加します。

コードで制約を作成するには、2 つの方法があります。constraintsWithVisualFormat通常、 は よりもはるかに簡潔ですconstraintWithItem

// Make label1's NSLayoutAttributeTrailing be the 'standard Aqua space' away from label2's NSLayoutAttributeLeading. Also, vertically align their baselines.
NSArray* constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[label1]-[label2]"  options:NSLayoutFormatAlignAllBaseline  metrics:nil  views:NSDictionaryOfVariableBindings(label1, label2) ] ;

次に、制約をラベルのスーパービューに追加します。

[label1.superview  addConstraints:constraints] ;   // Use `label1.superview` or your own reference to the label's superview.

Cocoa Auto Layout Guideは短く、簡単に理解できます。よろしければお読みください。ご不明な点がございましたら、喜んでお答えいたします。

編集 1

このオプションNSLayoutFormatAlignAllBaselineは、指定されたすべてのオブジェクトのベースラインを垂直方向に揃える制約 (VisualFormat 文字列によって作成されるものに加えて) を作成します。VisualFormat 文字列が垂直方向の制約 (「V:」で始まる) を作成している場合は、このオプションを使用したくありません。0 (オプションなし) を使用するか、NSLayoutFormatAlignAllCenterX などの水平方向の制約を作成するオプションを使用することをお勧めします。

于 2013-01-09T19:36:39.890 に答える