iOS7 – 调整多行标签的字体大小以适合其框架

我需要在UILabel的框架中拟合多行属性文本。 阅读此主题如何调整标签的字体大小以适应矩形? 我从Niels的解决方案开始,以便使用属性文本。

这是代码:’前景’的’t’被放在一个新的行中,而我需要不被截断的单词; 在这个例子中,我希望字体大小减少一点,以便在一条线上适应’前景。

UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 180, 180)]; myLabel.font = [UIFont fontWithName:@"Arial" size:5]; myLabel.adjustsFontSizeToFitWidth = YES; myLabel.backgroundColor = [UIColor orangeColor]; myLabel.numberOfLines = -1; myLabel.lineBreakMode = NSLineBreakByWordWrapping; NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; [paragraphStyle setLineSpacing:8]; [paragraphStyle setAlignment:NSTextAlignmentLeft]; NSDictionary *attributes = @{ NSFontAttributeName:myLabel.font, NSParagraphStyleAttributeName: paragraphStyle }; NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:@"New Prospect" attributes:attributes]; myLabel.attributedText = attributedString; myLabel.font = [UIFont fontWithName:@"Arial" size:160]; [self sizeLabel:myLabel toRect:myLabel.frame]; [self.view addSubview:myLabel]; 

sizeLabel方法实现如下:

 - (void) sizeLabel { int fontSize = self.font.pointSize; int minFontSize = 5; // Fit label width wize CGSize constraintSize = CGSizeMake(self.frame.size.width, MAXFLOAT); do { // Set current font size self.font = [UIFont fontWithName:self.font.fontName size:fontSize]; // Find label size for current font size CGRect textRect = [[self attributedText] boundingRectWithSize:constraintSize options:NSStringDrawingUsesLineFragmentOrigin context:nil]; CGSize labelSize = textRect.size; // Done, if created label is within target size if( labelSize.height  minFontSize); } 

标签

任何想法? 谢谢,DAN

您还需要检查每个单词以确保它们没有被截断,因为boundingRectWithSize:永远不会返回比您提供的宽度更宽的CGRect(即使单个单词不适合宽度)。 这是一个与该机制相似的循环:

 - (void)setButtonTitle:(NSString *)title { CGFloat fontSize = 20; // The max font size you want to use CGFloat minimumFontSize = 5; // The min font size you want to use CGFloat labelHeightWithFont = 0; CGFloat longestWordWidth = 0; UIFont *labelFont = nil; CGFloat buttonLabelMaxWidth = self.size.width; do { if (fontSize < minimumFontSize) { // Handle exception where the title just won't fit break; } // Trying the current font size if it fits labelFont = [UIFont systemFontOfSize:fontSize--]; CGSize boundingSize = [self boundingSizeForString:title font:labelFont]; labelHeightWithFont = boundingSize.height; // Be sure that words are not truncated (that they fits in the maximum width) longestWordWidth = 0; for (NSString *word in [title componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]) { CGSize wordSize = [word sizeWithAttributes:@{NSFontAttributeName: labelFont}]; longestWordWidth = MAX(longestWordWidth, wordSize.width); } // Loop until the text at the current size fits the maximum width/height. } while (labelHeightWithFont > buttonLabelMaxWidth || longestWordWidth > buttonLabelMaxWidth); self.buttonLabel.text = title; self.buttonLabel.font = labelFont; } - (CGSize)boundingSizeForString:(NSString *)string font:(UIFont *)font { CGRect boundingRect = [string boundingRectWithSize:CGSizeMake([self buttonLabelMaxWidth], MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName: font} context:nil]; return CGSizeMake(ceilf(boundingRect.size.width), ceilf(boundingRect.size.height)); }