1

私はAutoLayoutで遊んでいて、非常に単純な解決策であると思われるものを壁にぶつけています。

  1. コントロールの垂直列があります:1つのラベルと3つのボタン。
  2. ラベルの高さを40ピクセル(ポイント)にし、スーパービューの幅(左右の標準間隔)に基づいて幅を自動サイズ設定したいと思います。
  3. そのラベルの下に3つのボタンを縦に並べてほしい。
  4. ラベルと同じように幅を自動サイズにしたいと思います。
  5. それらの間隔を標準(アクア?)間隔(8ポイントでしょ?)にしたいのですが。
  6. 3つのボタンを同じ高さにしたいと思います。

実行したいものを取得することはできますが、実行時にコンソールでエラーが発生し続けます。なぜそれらを取得するのか、および取得を回避する方法を理解したいと思います。AutoLayoutでWWDCビデオを見てきましたが、これまでに試したことは次のとおりです。

UILabel *label = [self Label];
MMGlossyButton *button1 = ...
MMGlossyButton *button2 = ...
MMGlossyButton *button3 = ...
[[self view] addConstraints:
    [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[label]-|"
    options:0
    metrics:nil
    views:NSDictionaryOfVariableBindings(label)]];
[[self view] addConstraints:
    [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[button1]-|"
    options:0
    metrics:nil
    views:NSDictionaryOfVariableBindings(new)]];
[[self view] addConstraints:
    [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[button2]-|"
    options:0
    metrics:nil
    views:NSDictionaryOfVariableBindings(existing)]];
[[self view] addConstraints:
    [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[button3]-|"
    options:0
    metrics:nil
    views:NSDictionaryOfVariableBindings(provider)]];
[[self view] addConstraints:
    [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[label(40)]-[button1(>=25)]-[button2(==button1)]-[button3(==button1)]-|"
    options:0
    metrics:nil
    views:NSDictionaryOfVariableBindings(label, button1, button2, button3)]];

したがって、これは動的なサイズの方法でビューを表示するために機能しますが、コンソールに次のエラーが表示されます。

Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. 
Try this: 
    (1) look at each constraint and try to figure out which you don't expect; 
    (2) find the code that added the unwanted constraint or constraints and fix it. 
        (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you 
               don't understand, refer to the documentation for the UIView 
               property translatesAutoresizingMaskIntoConstraints) 

// A whole bunch of constraint stuff that doesn't appear to be important...

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7554c40 V:[MMGlossyButton:0x7554b40(99)]>

したがって、最後のビットは、ビューにある最初のボタンのサイズが静的に99ポイントであることを示しているように見えます。
ビューに表示されるサイズはどれですか。
これは完全に恣意的です。
割り当てたくないのですが、割り当てを解除する方法がわかりません。

私は(最終的には)欲しいものを手に入れていますが、それは非常に単純なことを達成するための本当に回りくどい方法のようです。AutoLayoutの基本的なことを見逃しているのでしょうか、それともその能力にはそのような複雑さが必要なのでしょうか。

4

1 に答える 1

7

コードで生成された制約とInterfaceBuilderによって追加された制約を混合して照合しているため、エラーが発生しています。Interface Builderではあいまいなレイアウトを生成できないため、ほとんどの場合、制約を追加すると"Unable to simultaneously satisfy"エラーが発生します。これは、多くの結婚の失敗です。

これを解決するには、Interface Builderで必要なすべての制約を定義するか、特定の制約をアウトレットとしてマークし、独自の制約を追加する前にコードで削除する必要があります。

あなたの場合、制約はIBで作成するのに十分単純です。

ラベルが選択されているときにIBでこのボタンを使用すると、特定の高さに固定できます。

ここに画像の説明を入力してください

真ん中のもの、それは桁のように見えます。これにより、次の便利なメニューが表示されます。

ここに画像の説明を入力してください

これらのいずれかを選択すると、ラベルに対して新しい制約を作成でき、ラベルを選択して編集できます。

ここに画像の説明を入力してください

次に、ボタンを追加し、3つすべてを選択して、同じメニューを使用して、同じ高さの制約を作成できます。

IBで作成された制約は特に柔軟ではないため、コードで制約を作成または変更する必要がある場合は、特定の制約へのアウトレットを作成してから、それらを削除して再作成するか、constant実行時の値。

于 2012-11-16T19:03:15.050 に答える