UILabel-テキストに合わせてラベルのサイズを自動調整しますか?


144

含まれているテキストに合わせてUILabelボックス/境界のサイズを自動変更することは可能ですか?(それがディスプレイよりも大きくなっても構わない)

したがって、ユーザーが「こんにちは」または「私の名前は本当に長いので、このボックスに収まるようにしたい」と入力した場合、切り捨てられることはなく、それに応じてラベルが「拡大」されますか?


誰でも迅速なコードの提供を手伝ってください..
エンジェルFシラス

回答:


98

私がUILabel非常によく似たもののためにカテゴリを作成した私の要点を確認してください。私のカテゴリは、UILabelすべてのコンテンツを表示するために高さを伸ばします:https : //gist.github.com/1005520

または、この投稿を確認してくださいhttps : //stackoverflow.com/a/7242981/662605

これは高さを伸ばしますが、逆に簡単に変更して幅を伸ばすことができます。これはあなたがやりたいことだと私は信じています:

@implementation UILabel (dynamicSizeMeWidth)

- (void)resizeToStretch{
    float width = [self expectedWidth];
    CGRect newFrame = [self frame];
    newFrame.size.width = width;
    [self setFrame:newFrame];
}

- (float)expectedWidth{
    [self setNumberOfLines:1];

    CGSize maximumLabelSize = CGSizeMake(CGRectGetWidth(self.bounds), CGFLOAT_MAX);

    CGSize expectedLabelSize = [[self text] sizeWithFont:[self font] 
                                            constrainedToSize:maximumLabelSize
                                            lineBreakMode:[self lineBreakMode]]; 
    return expectedLabelSize.width;
}

@end

クラスsizeToFitから使用できるメソッドをより簡単に使用できますが、UIView安全のために行数を1に設定します。


iOS 6アップデート

AutoLayoutを使用している場合は、組み込みのソリューションがあります。行数を0に設定すると、フレームワークはテキストに合わせてラベルのサイズを適切に変更します(高さを追加します)。


iOS 8アップデート

sizeWithFont:廃止予定なので、sizeWithAttributes:代わりに使用してください:

- (float)expectedWidth{
    [self setNumberOfLines:1];

    CGSize expectedLabelSize = [[self text] sizeWithAttributes:@{NSFontAttributeName:self.font}];

    return expectedLabelSize.width;
}

8
iOS 6のAutoLayoutメソッドを使用して、ラベルの高さの制約を取り除くことができませんでした。高さ制約の関係を「より大きいか等しい」に設定すると、高さが大きくなります。
マイケルルートン

2
sizeWithFont:constrainedToSize:lineBreakMode:method depricated in ios 7
Karan Alangat

1
UILabelは、テキストが小さい/大きい場合にサイズ変更しません。自動レイアウトを使用しています。UILabelを作成しようとしましたが、cellForRowAtIndexが初期化されるたびに作成されます。多くのものを試してみました。私には何もうまくいきません。uilabelの背景は同じ幅を取ります。助けて !!!
coreDeviOS 14

@Daniel行数を0に設定しましたが、機能しません。水平方向と垂直方向の中央に制約を設定しました。私が行ったもう1つのことは、UILABELのサブクラスを作成し、それをそのラベルに使用することです
Jasmeet

Autolayoutの最も簡単なソリューションは次のとおりです:(1)Linesを0に設定、(2)幅の制約を定数0で「Greater Than or Equal」に設定、(3)高さの制約を定数0で「Greater Than or Equal」に設定、( 4)水平方向と垂直方向の中央に配置するなどして、通常どおりに位置合わせします。
Erik van der Neut 2017

76

を使用して[label sizeToFit];も、Danielsカテゴリから同じ結果が得られます。

ただし、自動レイアウトを使用して、制約に基づいてラベルのサイズを変更することをお勧めします。


3
Swiftを使用するとき、dispatch_async(dispatch_get_main_queue()、{});を使用してメインスレッドでこれを実行する必要がありました。
Zeezer 2015年

@Zeezer、あなたはなぜか知っていますか?
FurloSK 2015

13
@FurloSK UIの変更はすべてメインスレッドで行う必要があります。
Guilherme Torres Castro

32

UILabelテキストサイズに基づいて縮小および拡大する必要がある場合は、自動レイアウト付きのストーリーボードが最適です。以下はこれを達成するための手順です

手順

  1. UILabelをビューコントローラーに配置し、好きな場所に配置します。のプロパティにも配置さ0numberOfLinesますUILabel

  2. トップ、リーディング、トレーリングのスペースピン制約を指定します。

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

  1. 警告が表示されるので、黄色の矢印をクリックします。

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

  1. をクリックしUpdate Frame、をクリックしFix Misplacementます。このUILabelは、テキストが少ない場合は縮小し、テキストが多い場合は拡大します。

1
ローカリゼーションについてはテストしていませんが、それでも動作するはずです。
Yogesh Suthar

2
「Preferred width」「Explicit」チェックボックスをオフにするまで、これを既存のプロジェクトで機能させることはできませんでした。
zorro2b 2016

25

これは、他のいくつかの回答が行うほど複雑ではありません。

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

左端と上端を固定する

自動レイアウトを使用して制約を追加し、ラベルの左側と上側を固定します。

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

その後、自動的にサイズ変更されます。

ノート

  • 幅と高さの制約を追加しないでください。ラベルには、テキストコンテンツに基づいた固有のサイズがあります。
  • これについて助けてくれたこの回答に感謝します。
  • sizeToFit自動レイアウトを使用する場合は設定する必要はありません。サンプルプロジェクトの完全なコードは次のとおりです。

    import UIKit
    class ViewController: UIViewController {
    
        @IBOutlet weak var myLabel: UILabel!
    
        @IBAction func changeTextButtonTapped(sender: UIButton) {
            myLabel.text = "my name is really long i want it to fit in this box"
        }
    }
  • ラベルを折り返す場合は、IBで行数を0に設定し、myLabel.preferredMaxLayoutWidth = 150 // or whateverコードを追加します。(また、ボタンをラベルの下部に固定して、ラベルの高さが上がるとボタンが下に移動するようにしました。)

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

  • 内でラベルを動的にサイズ変更する方法を探しているUITableViewCell場合は、この回答を参照してください。

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


こんにちは、サイズ変更されたラベルを取得しましたが、セルの高さのサイズ変更方法がわかりません。セルの高さを変更する方法を教えてください。
Vivek 2017年

@Vivekは、高さに制約が設定されていない限り、自動的にサイズ変更されます。
Suragch

はい、しかし、カスタムセルを使用し、彼のセルに2つのラベルを配置した場合、どのように可能になりますか。
Vivek 2017年

@Vivek、申し訳ありませんが、私はあなたの質問を読み間違えました。この回答を通過することで、すでに1つのラベルが機能していますか?
Suragch


5

上記のダニエルの回答に基づいていくつかのメソッドを作成しました。

-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text
{
    CGSize maximumLabelSize     = CGSizeMake(290, FLT_MAX);

    CGSize expectedLabelSize    = [text sizeWithFont:label.font
                                constrainedToSize:maximumLabelSize
                                    lineBreakMode:label.lineBreakMode];

    return expectedLabelSize.height;
}

-(void)resizeHeightToFitForLabel:(UILabel *)label
{
    CGRect newFrame         = label.frame;
    newFrame.size.height    = [self heightForLabel:label withText:label.text];
    label.frame             = newFrame;
}

-(void)resizeHeightToFitForLabel:(UILabel *)label withText:(NSString *)text
{
    label.text              = text;
    [self resizeHeightToFitForLabel:label];
}

5

これが私の状況でうまくいくと私が見つけているものです:

1)UILabelの高さには、autolayoutを使用した> = 0の制約があります。幅は固定です。2)UILabelにテキストを割り当てます。UILabelは、その時点ですでにスーパービューを持っています(どれほど重要かはわかりません)。3)次に、次の操作を行います。

    label.sizeToFit()
    label.layoutIfNeeded()

ラベルの高さが適切に設定されるようになりました。


3
@implementation UILabel (UILabel_Auto)

- (void)adjustHeight {

    if (self.text == nil) {
        self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.bounds.size.width, 0);
        return;
    }

    CGSize aSize = self.bounds.size;
    CGSize tmpSize = CGRectInfinite.size;
    tmpSize.width = aSize.width;

    tmpSize = [self.text sizeWithFont:self.font constrainedToSize:tmpSize];

    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, aSize.width, tmpSize.height);
}

@end

これはカテゴリー方式です。UILabelの高さを調整するには、このメソッドを呼び出すよりも先にテキストを設定する必要があります。


2

2つの方法を使用して、テキストやその他の関連コントロールに従ってラベルのサイズを変更できます。

  1. iOS 7.0以降の場合

    CGSize labelTextSize = [labelText boundingRectWithSize:CGSizeMake(labelsWidth, MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:@{
                                                        NSFontAttributeName : labelFont
                                                        }
                                              context:nil].size;

iOS 7.0より前は、これを使用してラベルサイズを計算できました

CGSize labelTextSize = [label.text sizeWithFont:label.font 
                            constrainedToSize:CGSizeMake(label.frame.size.width, MAXFLOAT)  
                                lineBreakMode:NSLineBreakByWordWrapping];

// labelTextHeightに基づいて他のコントロールをリフレームします

CGFloat labelTextHeight = labelTextSize.height;
  1. ラベルのテキストのサイズを計算したくない場合は、UILabelのインスタンスで-sizeToFitを使用できます-

    [label setNumberOfLines:0]; // for multiline label
    [label setText:@"label text to set"];
    [label sizeToFit];// call this to fit size of the label according to text

//この後、ラベルフレームを取得して、他の関連するコントロールをリフレームできます


2
  1. ストーリーボードに不足している制約を追加します。
  2. ストーリーボードでUILabelを選択し、属性「Line」を0に設定します。
  3. 参照アウトレットUILabelをid:labelでController.hに
  4. Controller.mと[label sizeToFit];viewDidLoadに追加

1

自動レイアウトで大きな問題が発生しました。テーブルセル内に2つのコンテナーがあります。2番目のコンテナーは、アイテムの説明(0〜1000文字)に応じてサイズ変更され、行はそれらに基づいてサイズ変更する必要があります。

不足している成分は、説明の下部の制約でした。

動的要素の下部の制約を= 0から> = 0に変更しました


これは私の命を救った。フォローしようとしている場合:github.com/honghaoz/…これが正解です。
ジャスティンファイルズ2016年

0

いつでもフィット!:)

    name.text = @"Hi this the text I want to fit to"
    UIFont * font = 14.0f;
    CGSize size = [name.text sizeWithAttributes:@{NSFontAttributeName: font}];
    nameOfAssessment.frame = CGRectMake(400, 0, size.width, 44);
    nameOfAssessment.font = [UIFont systemFontOfSize:font];

0

1つのライン出力を表示してからプロパティLine = 0を設定し、複数のライン出力を表示してからプロパティLine = 1以上を設定できます

[self.yourLableName sizeToFit];

-1

このアプローチもあります:

[self.myLabel changeTextWithAutoHeight:self.myStringToAssignToLabel width:180.0f];

この回答に反対票を投じたのは私ではありませんでしたが、でchangeTextWithAutoHeight:width:メソッドが表示されないことを指摘したかっただけUILabelです。UIKitのドキュメントでこのメソッドが見つかる場所へのリンクを提供してください。
アディルフセイン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.