高さがテキストに依存する UILabel をプログラムで (およびどの方法で) 構成するにはどうすればよいですか? ストーリーボードとコードを組み合わせてセットアップしようとしましたが、役に立ちませんでした。sizeToFit
とを設定lineBreakMode
しながら、誰もがお勧めしますnumberOfLines
。ただし、そのコードをviewDidLoad:
、viewDidAppear:
、またはviewDidLayoutSubviews
に入れても、動作しません。長いテキストに対してボックスを小さすぎて大きくならないか、大きすぎて縮小しません。
13 に答える
ほとんどの場合、Matt のソリューションは期待どおりに機能することに注意してください。しかし、それがうまくいかない場合は、さらに読んでください。
ラベルの高さを自動的に変更するには、次の操作を行う必要があります。
- ラベルのレイアウト制約を設定する
- 優先度の低い高さの制約を設定します。ContentCompressionResistancePriority よりも低くする必要があります
- numberOfLines = 0 を設定します。
- ContentHuggingPriority をラベルの高さ優先度よりも高く設定する
- ラベルに 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_)]];
インターフェイス ビルダーの使用
4 つの制約を設定します。高さ制限は必須です。
次に、ラベルの属性インスペクターに移動し、行数を 0 に設定します。
ラベルのサイズ インスペクターに移動し、垂直方向の ContentHuggingPriority と垂直方向の ContentCompressionResistancePriority を増やします。
高さの制約を選択して編集します。
高さ制限の優先度を下げます。
楽しみ。:)
iOS 6 では、autolayout を使用して、UILabel の側面 (または幅) と上部が固定されている場合、コンテンツに合わせて垂直方向に自動的に拡大および縮小します。コードはまったくなく、圧縮抵抗などをいじることもありません。とてもシンプルです。
より複雑なケースでは、ラベルのpreferredMaxLayoutWidth
.
いずれにせよ、正しいことは自動的に行われます。
IOS7 で sizeToFit も機能していないことに気付きました - おそらく解決策があなたにも役立つかもしれません
[textView sizeToFit];
[textView layoutIfNeeded];
適切な解決策を見つけるのに時間がかかったので、貢献する必要があると感じています:
- 目標は、sizeToFit() を呼び出さずに Auto Layout が機能するようにすることです。適切な制約を指定することでこれを行います。
- UILabel で上部、下部、および先頭/末尾のスペースの制約を指定します
- 行数プロパティを 0 に設定します
- コンテンツ ハギングの優先度を 1000 に上げます
- コンテンツの圧縮抵抗の優先度を 500 に下げる
- 一番下のコンテナの制約で、優先度を 500 に下げます
基本的に、固定の高さの制約があっても、コンテンツをハグするためにそれ自体を小さくするために制約を破ることができることをUILabelに伝えることです(たとえば、単一の行がある場合)が、それはできません制約を破って大きくします。
私はプログラムで追加しましUILabel
たが、私の場合はそれで十分でした:
label.translatesAutoresizingMaskIntoConstraints = false
label.setContentCompressionResistancePriority(UILayoutPriorityRequired, forAxis: .Vertical)
label.numberOfLines = 0
「優先幅」を自動に設定し、ラベルの上部、先頭、末尾を固定するxCode6で解決しました
UILabel を内部要素として含む UIView サブクラスでも、この問題に遭遇しました。自動レイアウトを使用し、推奨される解決策をすべて試しても、ラベルの高さがテキストに引き締まりません。私の場合、ラベルを 1 行にしたいだけです。
とにかく、私にとってうまくいったのは、UILabel に必要な高さの制約を追加し、intrinsicContentSize が呼び出されたときに手動で正しい高さに設定することでした。UILabel が別の UIView に含まれていない場合は、UILabel をサブクラス化し、最初に高さの制約を設定してから
[super instrinsicContentSize] を返すことで同様の実装を提供できます。[self.containerviewのintrinsiceContentSize]の代わりに; 以下のように、これは私の UIView サブラスに固有のものです。
- (CGSize)intrinsicContentSize
{
CGRect expectedTextBounds = [self.titleLabel textRectForBounds:self.titleLabel.bounds limitedToNumberOfLines:1];
self.titleLabelHeightConstraint.constant = expectedTextBounds.size.height;
return [self.containerView intrinsicContentSize];
}
iOS 7 および iOS 8 で完全に動作します。