0

私は次の状況にあります:

  1. 自動レイアウトを使用しています
  2. 情報テキスト用のをUITableViewCell含むがあります。UILabelこの下には、 「価格変更」(2番目の画像を参照)などのUILabel他のUI要素と、ボタン(画像には表示されていません)などの他の要素があります。uilabel
  3. 情報テキストuilabelの高さは動的であるため、下の要素は情報テキストラベルの高さに応じて垂直方向に下に移動します。
  4. 最初の写真では、水平線を見ることができます。情報ラベルの高さが高くなると、この水平線は垂直方向に下に移動します。「価格変更」ラベルは、この水平線の位置に応じて垂直方向に配置されます。

これは正常に機能します。情報テキストが大きくなると、他の要素は希望どおりに下に移動します。

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

今私の問題:情報テキストがないため、情報ラベルと水平セパレーターを非表示にする必要がある場合があります。残念ながら、uilabelの下の要素は、非表示になっていますが、ラベルの高さだけ下に移動します。私の写真の右側を見てください。要素は、赤い縦棒でマークされた量だけ上に移動する必要があります。

情報ラベルと「需要」ラベルが非表示になっている場合は、「価格が変更されました」などの要素を上に移動するように指示するにはどうすればよいですか。

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

アップデート:

ここで、2つのNSLayoutContstraintsをコードに追加し、ストーリーボードで作成された制約に接続しました(3番目の画像をご覧ください)

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

ここに説明があります。最初に2つのNSLayoutConstraintsを取得しました。horizo​​ntalSeparatorContstraintは、「PriceChangesin」ラベルを最初の水平セパレータUIImageViewに接続します。「Demands」と「SpecialRequestsLabel」が非表示になっている場合、この制約が有効になり、「Pricechangesin」ラベルが上に移動するように値を4単位に設定しました。2番目の制約:demandsLabelContstraint-これは、2番目の水平UIImageViewと「価格変更」ラベルの間の不要なスペースを示します。ギャップは4単位である必要があります。また、特別なリクエストのテキストが利用可能な場合、この制約は「acitve」である必要があります。

ここにいくつかの新しいコードがあります:

if( tour.specialRequests.length > 0 ) {
    [demandsLabelContstraint setPriority:UILayoutPriorityDefaultHigh];
    [horizontalSeparatorContstraint setPriority:UILayoutPriorityDefaultLow];

    self.demandsLeftLabel.text = NSLocalizedString(@"GenericTour_Demands", @"");
    self.demandsRightLabel.text = tour.specialRequests;

    demandsLeftLabel.hidden = NO;
    demandsRightLabel.hidden = NO;
    horizontalSeparator.hidden = NO;
} else {
    [demandsLabelContstraint setPriority:UILayoutPriorityDefaultLow];
    [horizontalSeparatorContstraint setPriority:UILayoutPriorityDefaultHigh];

    horizontalSeparator.hidden = YES;
    demandsRightLabel.hidden = YES;
    demandsLeftLabel.hidden = YES;
}

コードから次のことがわかります。私の考えは、状況ごとに優先順位を切り替えることです。特別なリクエストテキストが利用可能な場合、優先度を設定することにより、対応するNSLayoutContraintsがトリガーされます。

自動レイアウトについての私の意図または理解は、優先順位を変更することでそれらを切り替えることができるということです。しかし、そうではないようです。

では、どうすれば問題を解決できますか。

4

1 に答える 1

0

を追加すると、Interface Builderで作成された制約であっても、プログラムで制約を追加および削除できますIBOutlet

したがって、情報ラベルと水平区切り文字に関連する制約にを追加し、IBOutletそれらが非表示になっている場合は、それらの制約を削除して、ラベルが再度表示されたときに元に戻すことができます。

次に、情報ラベルが非表示になっている場合は常に、価格変更ラベルを上部の水平セパレーターにリンクする新しい制約を追加して、価格変更ラベルが正しく接続されるようにします。

WWDC 2012には、このようなことを行う方法を説明するビデオがありました。これは、自動レイアウトをマスターするためのベストプラクティスだったと思います。

于 2013-03-09T00:53:30.807 に答える