在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可以让你现在就做到这一点。

  1. 在UILabel中,在自动收缩下,select“最小字体大小”而不是“固定字体大小”。
  2. 设置最小字体大小是合理的,如8。
  3. 您也可以选中勾号“拧紧字母间隔”

另外,你可以通过编程来完成:

 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。