ここに私のコードがあります
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(10, 50, 300, 50)];
label.textAlignment = UITextAlignmentCenter;
label.backgroundColor = [UIColor clearColor];
label.textColor = [UIColor whiteColor];
label.textColor.font = [UIFont fontWithName:@"Verdana" size:30];
label.text = @"A very long string";
etc...
問題は、フォントが大きく、ラベルに収まらないことです。 「非常に」と表示されるだけです
テキスト全体が表示されるようにする方法。私が試してみました
label.lineBreakMode = UILineBreakModeWordWrap;
label.numberOfLines = 0;
しかし、私にはうまくいきません。プログラムでそれをしたいです。
//編集
CGRect frame = CGRectMake(10, 50, 300, 50);
NSString *labelString = @"Players.";
UILabel *howManyUsersLabel = [[UILabel alloc]initWithFrame:frame];
howManyUsersLabel.textAlignment = UITextAlignmentCenter;
howManyUsersLabel.backgroundColor = [UIColor clearColor];
howManyUsersLabel.textColor = [UIColor whiteColor];
howManyUsersLabel.adjustsFontSizeToFitWidth = NO;
howManyUsersLabel.numberOfLines = 0;
CGFloat fontSize = 30;
while (fontSize > 0.0)
{
CGSize size = [labelString sizeWithFont:[UIFont fontWithName:@"Verdana" size:fontSize] constrainedToSize:CGSizeMake(frame.size.width, 10000) lineBreakMode:UILineBreakModeWordWrap];
if (size.height <= frame.size.height) break;
fontSize -= 1.0;
NSLog(@"test");
}
howManyUsersLabel.font = [UIFont fontWithName:@"Verdana" size:fontSize];
これを追加するだけでいいと思います:
label.adjustsFontSizeToFitWidth = YES;
label.minimumFontSize = 0;
その後、テキストはラベルに合わせて自動的にサイズ変更されます。
ただし、これは実際にはlabel.numberOfLines = 1の場合にのみ機能するため、テキストは1行になります。
テキストを複数行に折り返す必要があるが、それでも収まるように縮小する必要がある場合、ソリューションはより複雑になります。これを行うには、次のように、テキストのレンダリングされたサイズを計算し、ループで縮小する必要があります。
NSString *theText = @"A long string";
CGRect labelRect = CGRectMake(10, 50, 300, 50);
label.adjustsFontSizeToFitWidth = NO;
label.numberOfLines = 0;
CGFloat fontSize = 30;
while (fontSize > 0.0)
{
CGSize size = [theText sizeWithFont:[UIFont fontWithName:@"Verdana" size:fontSize] constrainedToSize:CGSizeMake(labelRect.size.width, 10000) lineBreakMode:UILineBreakModeWordWrap];
if (size.height <= labelRect.size.height) break;
fontSize -= 1.0;
}
//set font size
label.font = [UIFont fontWithName:@"Verdana" size:fontSize];
これは基本的に、ラベルに収まるまでフォントサイズを小さくするだけです。
更新:
IOS7の時点で、adjustsFontSizeToFitWidth = YES
ので、この回答の2番目の部分は不要になりました(iOS 6以前をまだサポートしていない場合)。
最後に、アラビア語のテキスト配置の問題の解決策を見つけました。
label.text = @"هذا هو نص طويل جدا";
label.textAlignment = NSTextAlignmentNatural;
CGSize size = [labels sizeThatFits:CGSizeMake(_lblAddress.width, CGFLOAT_MAX)];
label.height = size.height;
[UILabel sizeToFit];
それはあなたの問題のために働きます。
iOS 9でのスイフト
let maxFontSize: CGFloat = 40
let minFontSize: CGFloat = 10
label.font = UIFont(name: label.font.fontName, size: maxFontSize)!
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = minFontSize/maxFontSize
これにより、ラベルを埋めるためのフォントサイズは増加しません。最大サイズから始まり、必要に応じて最小サイズまで減少します。また、行数が1であると仮定しています。
CGRect titleRect = CGRectMake(10, 50, 300, 50);
UILabel *textTitleView = [[UILabel alloc] initWithFrame:titleRect];
textTitleView.numberOfLines = 3 //for multiple lines;
textTitleView.lineBreakMode = UILineBreakModeWordWrap;
[UIFont fontWithName:@"Verdana" size:30];
textTitleView.text = @"your text";
Interface Builderでは、これをすぐに行うことができます。
または、プログラムで実行することもできます。
label.adjustsFontSizeToFitWidth = YES;
IOS 8(おそらくiOS 7も)ですべてが壊れているようです。
-(UIFont*)fontForString:(NSString*)string toFitInRect:(CGRect)rect seedFont:(UIFont*)seedFont {
UIFont* returnFont = seedFont;
CGSize stringSize = [string sizeWithAttributes:@{NSFontAttributeName : seedFont}];
while(stringSize.width > rect.size.width){
returnFont = [UIFont systemFontOfSize:returnFont.pointSize -1];
stringSize = [string sizeWithAttributes:@{NSFontAttributeName : returnFont}];
}
return returnFont;
}
label.adjustsFontSizeToFitWidth = YES
を使用しようとしないでください。そうしないと、混乱してしまい、新しいサイズが適切に機能しません。