我有一个特定的CGSize的UILabel,在这里,我不能展开UILabel的框架,因为它是一个多行UILabels方法不工作。
所以,我想我应该创造这样的功能,看起来像;
- (CGFloat)fontSizeWithText:(NSString*)text andFont:(UIFont*)font constrainedSize:(CGSize)size LBM:(UILineBreakMode)LBM
{
// check if text fits to label
CGSize labelSize = [text sizeWithFont:font constrainedToSize:CGSizeMake(size.width, 9999) lineBreakMode:LBM];
// if not, decrease font size until it fits to the given size
while (labelSize.height > size.height) {
font = [UIFont fontWithName:font.fontName size:font.pointSize - 0.5];
labelSize = [text sizeWithFont:font constrainedToSize:CGSizeMake(size.width, 9999) lineBreakMode:LBM];
}
return font.pointSize;
}用法:
// fit detail label by arranging font's size
CGFloat fontSize = [self fontSizeWithText:self.titleLabel.text andFont:self.titleLabel.font constrainedSize:self.titleLabel.frame.size LBM:self.titleLabel.lineBreakMode];
self.titleLabel.font = [UIFont fontWithName:self.titleLabel.font.fontName size:fontSize];但是使用这种方法,我发现我的一些文本不适合UILabel的框架,并且会被截断。一定有什么东西我错过了。对于代码的任何帮助,或者关于解析“将给定字体的文本与特定的多行UILabel相匹配”的任何其他建议都是很好的。
发布于 2013-02-10 14:17:22
首先,让我们从整体上快速地看一下这个问题。您正在尝试将文本安装到预定义的框架中,并调整字体大小。这通常不会工作得很好,因为你会很快达到尺寸太小,难以阅读,即使在视网膜显示器。您应该调整标签的框架以适应多余的文本(在可能的情况下)。有时,截断是唯一的选择。)
现在,这已经过时了,让我们来看看如何调整字体大小。尽管没有建议,但我仍将解释如何最好地解决这个问题。
重要的,这段代码是未经测试的,很可能需要一些调整,但这可能是读者的练习。
所以我们首先要知道的是单线的高度。现在,我们有标签的高度,以及它可以显示的行数,所以我们可以通过简单地将标签高度除以行数来确定这一点。
CGFloat optimalLineHeight = CGRectGetHeight(label.frame) / label.numberOfLines;您可能已经注意到,这可能会返回比实际需要的更高的线条。您将能够实现额外的检查和约束来处理这个问题。然而,在目前,字体大小也将能够增长,而不仅仅是缩小。
现在,获得最佳线高只是故事的一部分。我们现在需要优化字体大小。下面是一些代码:
CGFloat optimumFontSize = 0.0;
BOOL optimumFontSizeFound = NO;
do {
CGSize charSize = [@"M" sizeWithFont:[UIFont systemFontOfSize:optimumFontSize]
constrainedToSize:CGSizeMake(100, 9999)
lineBreakMode:0];
if ( CGSizeGetHeight(charSize) > optimalLineHeight ) {
optimumFontSizeFound = YES;
}
else {
optimumFontSize++;
}
} while ( !optimumFontSizeFound );那这是干什么用的?在这个过程中,我们跟踪optimumFontSize到目前为止。我们首先假设字体大小为0,然后我们看到使用该字体大小的单个字符有多高。如果该高度大于先前计算的最佳直线高度,则前一高度是最优的。如果没有,我们增加大小并重复,直到找到最优的。
在这方面还有许多问题要克服,才能使它在所有情况下都能完美地工作。这应该确保您不会获得可见的垂直裁剪字符,但它不能确保所有的文本内容将显示在框架中。要做到这一点,您需要在如何确定所需行数方面更加聪明,但我将保留这一点,作为读者的练习。
希望这能帮助你实现你的目标。
https://stackoverflow.com/questions/14798328
复制相似问题