web-dev-qa-db-ja.com

iOS動的サイズ変更ラベル

オンラインで検索しようとしましたが、私の問題に対する明確な答えが見つからなかったので、専門家のアドバイスを求めに来ました。ビューに2つのラベルがあります。最初のラベルは、2〜3文字の名前の略語を示すために使用されます。 2番目のラベルにはフルネームが表示されます。

私が持っている質問は、与えられたフォントの種類、サイズ、文字列の長さに基づいてラベルのサイズを動的に変更する方法があったかどうかです。 2つ目のラベルを最初のラベルの近くに置きたいのは、2つのラベルの間のスペースが大きすぎず、最初のラベルが2番目のラベルと重ならないようにするためです。

これが1つのラベルにすべてではない理由は、最初のラベルが2番目のラベルよりも大きいフォントと異なる配色を持つ必要があるためです。

どんなアドバイスも大歓迎です。

28
Seb

文字列が表示されるサイズを計算し、UILabelのフレームをそのサイズに設定できます。サンプルとして次のコードを参照してください-

//Calculate the expected size based on the font and linebreak mode of your label
CGSize maximumLabelSize = CGSizeMake(296,9999);

CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font 
                        constrainedToSize:maximumLabelSize 
                        lineBreakMode:yourLabel.lineBreakMode]; 

//adjust the label the the new height.
CGRect newFrame = yourLabel.frame;
newFrame.size.height = expectedLabelSize.height;
yourLabel.frame = newFrame;

更新-

使用する sizeWithAttributes:代わりに、NSDictionaryを取ります。キーUITextAttributeFontとフォントオブジェクトを次のようにペアで渡します。

CGSize size = [string sizeWithAttributes:
                       @{NSFontAttributeName:
                         [UIFont systemFontOfSize:17.0f]}];

非推奨のsizeWithFontの置き換え:iOS 7で? 詳細について

64
Saurabh

これもトリックを行い、属性付きテキストを考慮します

label.attributedText = attrString;
CGSize maximumLabelSize = CGSizeMake(187,CGFLOAT_MAX);
CGSize requiredSize = [label sizeThatFits:maximumLabelSize];
CGRect labelFrame = label.frame;
labelFrame.size.height = requiredSize.height;
label.frame = labelFrame;
16
noRema

'sizeWithFont:'は非推奨です。最初はiOS 7.0で非推奨です。

sizeWithAttributesを試してください

- (void)viewDidLoad
{
    [super viewDidLoad];

    label = [[UILabel alloc] initWithFrame:CGRectMake(20, 40, 300, 20)];

    label.backgroundColor = [UIColor blueColor];

     const CGFloat fontSize = 30;
     UIFont *regularFont = [UIFont systemFontOfSize:fontSize];
     UIColor *foregroundColor = [UIColor blackColor];

     attrs = [NSDictionary dictionaryWithObjectsAndKeys:
     regularFont, NSFontAttributeName,
     foregroundColor, NSForegroundColorAttributeName
     , nil];

     NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc]
     initWithString:@"Test Text"
     attributes:attrs];

     [label setAttributedText:attributedText];
     [self.view addSubview:label];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGSize expectedLabelSize = [label.text sizeWithAttributes:attrs]; // iOS 7 Code <--

    CGRect newFrame = label.frame;
    newFrame.size.width = expectedLabelSize.width;
    label.frame = newFrame;

    NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc]
                                                 initWithString:@"Longer Test Text"
                                                 attributes:attrs];

    [label setAttributedText:attributedText];
}
10
schirrmacher

AssizeWithFont:はiOS 7で非推奨になりましたsizeWithAttributesを使用する必要があります(maverの説明どおり here )。コードを簡素化するために、次のように再利用できるメソッドを追加できます。

-(CGRect)rectForText:(NSString *)text 
           usingFont:(UIFont *)font 
       boundedBySize:(CGSize)maxSize
{
    NSAttributedString *attrString =
        [[NSAttributedString alloc] initWithString:text
                                        attributes:@{ NSFontAttributeName:font}];

    return [attrString boundingRectWithSize:maxSize
                                    options:NSStringDrawingUsesLineFragmentOrigin
                                    context:nil];
}

そしてそれを利用する

CGSize maximumLabelSize = CGSizeMake(280,9999);
UIFont *font = [UIFont systemFontOfSize:20];
CGRect titleRect = [self rectForText:post.title // <- your text here 
                           usingFont:font
                       boundedBySize:maximumLabelSize];
8
eduludi

Saurabhの答えに加えて。私は同じ問題を抱えていたので、この行を追加する必要があります
[yourLabel setNumberOfLines:0];
テキスト全体をX行で表示するため。

7
Slavcho