1. ホーム
  2. ios

[解決済み] UILabel - テキストに合うようにラベルを自動サイズ?

2022-05-01 02:28:17

質問

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

つまり、ユーザーが "hello" や "my name is really long i want to fit it in this box" を入力しても、それは決して切り捨てられず、ラベルはそれに応じて「広げられる」のですね。

どのように解決するのですか?

のカテゴリを作成した私のgistをご覧ください。 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;
}