在UILabel中适合文本
这是我的代码
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;
然后文本将自动resize以适应标签。
但是请注意,如果label.numberOfLines = 1,这只会真的起作用,所以文本是在一行上。
如果你需要将文本包装成多行,但仍然缩小以适应,解决scheme更复杂。 为此,您需要计算文本的渲染大小,然后在循环中将其缩小,如下所示:
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];
这基本上只是减less字体大小,直到它符合标签。
更新:
从iOS7开始,当adjustsFontSizeToFitWidth = YES
时,多行文本也会自动缩小,因此不再需要此答案的第二部分(除非您仍然支持iOS 6及更早的版本)。
最后,我得到了阿拉伯文语言文本调整问题的解决scheme,您可以这样做:
label.text = @"هذا هو نص طويل جدا"; label.textAlignment = NSTextAlignmentNatural; CGSize size = [labels sizeThatFits:CGSizeMake(_lblAddress.width, CGFLOAT_MAX)]; label.height = size.height;
[UILabel sizeToFit];
它会为你的问题工作。
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可以让你现在就做到这一点。
- 在UILabel中,在自动收缩下,select“最小字体大小”而不是“固定字体大小”。
- 设置最小字体大小是合理的,如8。
- 您也可以选中勾号“拧紧字母间隔” 。
另外,你可以通过编程来完成:
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
否则会变得非常困惑,新的大小将无法正常工作。
Swift与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。