具有adjustsFontSizeToFitWidth的多行UILabel [英] Multiline UILabel with adjustsFontSizeToFitWidth
问题描述
我有一个多行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屋!