1. ホーム
  2. ios

[解決済み] UILabel sizeToFitがautolayout ios6で動作しない。

2022-04-26 20:26:26

質問

高さがテキストに依存するUILabelをプログラムで(どのような方法で)設定すればよいのでしょうか? Storyboardとコードの組み合わせで設定しようとしていますが、うまくいきません。 みんなが勧めるのは sizeToFit を設定しながら lineBreakModenumberOfLines . しかし、そのコードを viewDidLoad: , viewDidAppear: または viewDidLayoutSubviews うまく動作させることができません。 長いテキストに対してボックスを小さくしすぎて大きくならないか、大きくしすぎて縮まないかのどちらかです。

解決方法は?

ご注意ください ほとんどの場合 マットの解決策 は期待通りに機能します。しかし、もしそれがうまくいかない場合は、さらに読み進めてください。

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

  1. ラベルのレイアウト制約を設定する
  2. 高さの制約を低い優先度で設定します。ContentCompressionResistancePriorityよりも低い値である必要があります。
  3. NumberOfLines = 0 に設定します。
  4. ContentHuggingPriorityをラベルの高さの優先順位よりも高く設定します。
  5. ラベルのpreferredMaxLayoutWidthを設定します。この値はラベルが高さを計算するために使用されます。

例えば

self.descriptionLabel = [[UILabel alloc] init];
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_)]];

インターフェースビルダーを使う

  1. 4つのコンストレイントを設定します。高さの制約は必須です。

  2. 次に、ラベルの属性インスペクタで、行数を0に設定します。

  3. ラベルのサイズインスペクタで、垂直方向のContentHuggingPriorityと垂直方向のContentCompressionResistancePriorityを大きくしてください。

  4. 高さ制限を選択し、編集します。

  5. また、高さ制約の優先順位を下げる。

お楽しみください。:)