5

次のように動作する2つのUILabelサブビューを使用してコンテナビューをプログラムで作成しようとしています。

  • コンテナの幅はそのスーパービューに固定されています。その高さはラベルに合うように制限されています
  • ラベルは、標準の間隔で水平に配置されます(8ポイント)
  • 左側のラベルの幅は、コンテナの幅の25%です。
  • 右側のラベル幅は、標準の水平方向の間隔を差し引いた、使用可能なスペースを埋めます
  • 長いテキストは単語の境界で分割する必要があります。複数の行にまたがって流れます。長いテキストに対応するには、両方のラベルを垂直方向に拡大する必要があります

numberOfLines = 0とでラベルを定義しましたlineBreakMode = NSLineBreakByWordWrapping

コンテナのサイズは完全に動的であることに注意してください。その幅はそのスーパービューによって決定され、その高さはそのサブビュー(ラベル)によって決定されます。ラベルのサイズも動的です。それらの幅はコンテナの幅に比例し、それらの高さはテキストの長さに依存します。

次の制約(擬似コード)を使用して、最後の項目を除いて、上記のすべてを達成することができました。Aは左側のラベル、Bは右側のラベルです。

  • A.top == container.top
  • B.top == container.top
  • A.leading = container.leading
  • A.trailing == B.leading-8
  • B.trailing == container.trailing
  • A == .25 * container.width
  • container.height> = A.height
  • container.height> = B.height

最後の2つの制約は、ラベルの背の高い方に合うようにコンテナーを拡張することを目的としていますが、レイアウトエンジンは、ラベルが複数行である可能性があるという事実を無視しているようです。つまり、テキストの長さに関係なく、常に1行が表示されます。

では、上記の動作の完全なセットを実現するには、どのような制約を追加/変更/削除する必要がありますか?

4

3 に答える 3

8

ラベルの高さを自動的に変更するには、次の操作を行う必要があります。

  1. ラベルのレイアウト制約を設定します(実際に行ったこと)
  2. 優先度の低い高さの制約を設定します。ContentCompressionResistancePriorityよりも恋人であるべき
  3. numberOfLines = 0 を設定します。
  4. ContentHuggingPriority をラベルの最高優先度よりも高く設定する
  5. ラベルに preferredMaxLayoutWidth を設定します。その値は、その高さを計算するためにラベルによって使用されます

例えば:

self.descriptionLabel = [[[UILabel alloc] init] autorelease];
self.descriptionLabel.numberOfLines = 0;
self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping;
self.descriptionLabel.preferredMaxLayoutWidth = 200;

[self.descriptionLabel setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];
[self.descriptionLabel setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];
[self.descriptionLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
[self addSubview:self.descriptionLabel];

NSArray* constrs = [NSLayoutConstraint constraintsWithVisualFormat:@"|-8-[descriptionLabel_]-8-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(descriptionLabel_)];
[self addConstraints:constrs];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-8-[descriptionLabel_]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(descriptionLabel_)]];
[self.descriptionLabel addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[descriptionLabel_(220@300)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(descriptionLabel_)]];
于 2012-12-18T20:24:50.143 に答える
0

ラベルの高さ制約の優先度を低い値に設定し、コードで制約を設定してみてください。

于 2012-12-05T04:54:51.923 に答える
0

必ず設定してください

  1. 水平および垂直コンテンツの圧縮耐性が優先されます。ラベルの内容を切り詰めたくない場合は、 1000.ie に設定してくださいrequired
  2. 内容重視優先。この回答を見て、それがどのように機能するかを理解してください。
于 2014-03-05T13:33:37.540 に答える