具有adjustsFontSizeToFitWidth的多行UILabel [英] Multiline UILabel with adjustsFontSizeToFitWidth

查看:203
本文介绍了具有adjustsFontSizeToFitWidth的多行UILabel的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个多行UILabel,其字体大小我想根据文本长度进行调整。整个文本应该适合标签的框架而不截断它。

I have a multiline UILabel whose font size I'd like to adjust depending on the text length. The whole text should fit into the label's frame without truncating it.

不幸的是,根据文档, adjustsFontSizeToFitWidth 属性仅当 numberOfLines 属性设置为1时才有效。

Unfortunately, according to the documentation the adjustsFontSizeToFitWidth property "is effective only when the numberOfLines property is set to 1".

我试图确定调整后的字体大小使用

I tried to determine the adjusted font size using

-[NSString (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode]

然后递减字体大小直到它适合。不幸的是,此方法在内部截断文本以适应指定的大小,并返回生成的截断字符串的大小。

and then decrementing the font size until it fits. Unfortunately, this method internally truncates the text to fit into the specified size and returns the size of the resulting truncated string.

推荐答案

In 这个问题,0x90提供了一个解决方案 - 虽然有点难看 - 做我想要的。具体来说,它正确处理单个单词不适合初始字体大小的宽度的情况。我稍微修改了代码,使其在 NSString 上作为一个类别:

In this question, 0x90 provides a solution that - although a bit ugly - does what I want. Specifically, it deals correctly with the situation that a single word does not fit the width at the initial font size. I've slightly modified the code so that it works as a category on NSString:

- (CGFloat)fontSizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size {
    CGFloat fontSize = [font pointSize];
    CGFloat height = [self sizeWithFont:font constrainedToSize:CGSizeMake(size.width,FLT_MAX) lineBreakMode:UILineBreakModeWordWrap].height;
    UIFont *newFont = font;

    //Reduce font size while too large, break if no height (empty string)
    while (height > size.height && height != 0) {   
        fontSize--;  
        newFont = [UIFont fontWithName:font.fontName size:fontSize];   
        height = [self sizeWithFont:newFont constrainedToSize:CGSizeMake(size.width,FLT_MAX) lineBreakMode:UILineBreakModeWordWrap].height;
    };

    // Loop through words in string and resize to fit
    for (NSString *word in [self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]) {
        CGFloat width = [word sizeWithFont:newFont].width;
        while (width > size.width && width != 0) {
            fontSize--;
            newFont = [UIFont fontWithName:font.fontName size:fontSize];   
            width = [word sizeWithFont:newFont].width;
        }
    }
    return fontSize;
}

使用 UILabel

    CGFloat fontSize = [label.text fontSizeWithFont:[UIFont boldSystemFontOfSize:15] constrainedToSize:label.frame.size];
    label.font = [UIFont boldSystemFontOfSize:fontSize];

编辑:修正了初始化 newFont的代码 font 。修复了某些情况下的崩溃。

EDIT: Fixed the code to initialize newFont with font. Fixes a crash under certain circumstances.

这篇关于具有adjustsFontSizeToFitWidth的多行UILabel的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆