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

查看:25
本文介绍了带有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".

我尝试使用

-[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.

推荐答案

这个问题, 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];

EDIT:修正了用 font 初始化 newFont 的代码.修复了某些情况下的崩溃问题.

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

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

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