web-dev-qa-db-ja.com

UILabel - テキストに合わせて自動サイズラベルを付ける

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

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

139
wayneh

UILabelname__のカテゴリーを作成したところで私の要旨をチェックしてください。私のカテゴリーでは、UILabelname__にすべてのコンテンツを表示できるようにすることができます。 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

もっと簡単にsizeToFitname__クラスから利用可能なUIViewname__メソッドを使用できますが、安全のために行数を1に設定します。


iOS 6アップデート

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


iOS 8アップデート

sizeWithFont:は非推奨なので、代わりにsizeWithAttributes:を使用してください。

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

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

    return expectedLabelSize.width;
}
97
Daniel

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

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

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

ステップ

  1. UILabelをView Controllerに入れて、好きな場所に配置します。 numberOfLinesUILabelプロパティにも0を入れます。

  2. 上、前、後のスペースピン制約を適用します。

enter image description here

  1. 警告が出ますので、黄色い矢印をクリックしてください。

enter image description here

  1. Update Frameをクリックし、Fix Misplacementをクリックしてください。これで、このUILabelはテキストが少ない場合は縮小し、テキストが多い場合は拡大します。
32
Yogesh Suthar

これは、他のいくつかの答えが示すほど複雑ではありません。

enter image description here

左端と上端を固定する

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

enter image description here

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

ノート

  • 幅と高さに制約を追加しないでください。ラベルは、テキストの内容に基づいて固有のサイズになります。
  • これを手伝ってくれた この答え に感謝します。
  • 自動レイアウトを使用するときに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を追加します。 (ラベルの高さが増えるとボタンが下に移動するように、ボタンをラベルの下部に固定しました。)

enter image description here

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

enter image description here

22
Suragch

UILabelのテキストを調整するには[label sizeToFit];を使用してください

9
Gaurav Gilani

私は上記のDanielの回答に基づいていくつかのメソッドを作成しました。

-(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
Doug Baker
@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の高さを調整するためにこのメソッドを呼び出すよりも、最初にテキストを設定する必要があります。

3
Kaijay Lu

あなたは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
vijeesh

これが私の状況に合ったものです。

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

    label.sizeToFit()
    label.layoutIfNeeded()

ラベルの高さが適切に設定されました。

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

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

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

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

1
Bojan Tadic

1行の出力を表示してプロパティを設定するLine =複数行の出力を表示してプロパティを設定するLine = 1以上

[self.yourLableName sizeToFit];
0
Dixit Akabari

いつでもフィット! :)

    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];