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

4
我需要将多行属性文本适配到UILabel的框架中。 阅读这个主题如何调整标签字体大小以适应矩形?我从Niels的解决方案开始,以便处理带属性的文本。
以下是代码:'prospect'的't'被放在新行中,但我需要单词不被截断;在这个例子中,我期望字体大小进一步减小,以适应'prospect'在一行中。
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 <= self.frame.size.height )
            break;

        // Decrease the font size and try again
        fontSize -= 2;

    } while (fontSize > minFontSize);
}

标签

有什么想法吗? 谢谢, DAN


你找到解决方案了吗?我也有同样的问题 :( - tyler
1个回答

1
您还需要检查每个单词,以确保它们没有被截断,因为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));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接