オンラインで検索しようとしましたが、私の問題に対する明確な答えが見つからなかったので、専門家のアドバイスを求めに来ました。ビューに2つのラベルがあります。最初のラベルは、2〜3文字の名前の略語を示すために使用されます。 2番目のラベルにはフルネームが表示されます。
私が持っている質問は、与えられたフォントの種類、サイズ、文字列の長さに基づいてラベルのサイズを動的に変更する方法があったかどうかです。 2つ目のラベルを最初のラベルの近くに置きたいのは、2つのラベルの間のスペースが大きすぎず、最初のラベルが2番目のラベルと重ならないようにするためです。
これが1つのラベルにすべてではない理由は、最初のラベルが2番目のラベルよりも大きいフォントと異なる配色を持つ必要があるためです。
どんなアドバイスも大歓迎です。
文字列が表示されるサイズを計算し、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]}];
これもトリックを行い、属性付きテキストを考慮します
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;
'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];
}
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];
Saurabhの答えに加えて。私は同じ問題を抱えていたので、この行を追加する必要があります[yourLabel setNumberOfLines:0];
テキスト全体をX行で表示するため。