1

ペン先で初めて Autolayout を使用しようとしています。私の場合はNSLayoutConstraints、完璧な解決策になる教科書的な状況のようです。

その横に with と画像がありますUITableviewCellUILabel画像は、下にあるデータのプロパティに応じて変化し、サイズが変更されたり、場合によっては非表示になったりすることがあります。私の意図は、ラベルが画像から一定の距離を保ち、画像が非表示のときにセル全体にまたがるようにすることです。

それに応じて、ラベルに制約を設定します。

  • 後縁が画像の前縁から設定された距離にある 1 つの制約。優先度は高いですが、必須ではありません。
  • スーパービュー エッジから設定された距離にトレーリング エッジを持つ 1 つの制約で、優先度ははるかに低くなります。
  • 適切な左と上の制限、ラベルの幅の制限なし。

画像が非表示の場合でも、ラベルは最初の制約によって短縮されたままです。これは予想される動作ですか?私は通常、実行時にラベルの幅を計算して変更しますが、これはまさに NSLayoutConstraints が意図された状況のようです。

画像が表示されていないときに画像への制約を無視するにはどうすればよいですか?

4

2 に答える 2

8

NSLayoutConstraint のクラス参照から、制約が配置されると、制約の優先度を変更することはできません。また、優先順位の高い制約は常に低い制約よりも優先されます。

制約を削除して、再度追加することができます。ストーリーボードや IB で制約を入れる場合は、NSLayoutConstraint の IBOutlet を作成して接続することができます。

IBOutlet のコード行を自動生成する Xcode 機能を使用すると、IBOutlet が弱いと宣言されます。制約を削除した後で制約を再度追加する場合は、それを strong に変更する必要があります。これは、制約が削除された後に制約が解放されるのを避けるためです。

次に、画像が非表示の場合は最初の制約を削除すると、2 番目の制約が適用されます。

[self.view removeConstraint:self.firstConstraint];

制約を削除した後、layoutIfNeeded を呼び出す必要がある場合があります。

于 2013-06-06T10:55:32.583 に答える
5

iOS 8 では、制約をアクティブ化/非アクティブ化できます ( https://developer.apple.com/library/ios/releasenotes/General/iOS80APIDiffs/frameworks/UIKit.html ):

優先度の低い 2 つの制約を作成し、ビューを非表示にするときに優先度の高い制約を非アクティブ化し、ビューが再び表示されたときに再度アクティブ化します。

[self.firstConstraint setActive:NO];

于 2014-11-05T16:38:13.780 に答える