我有一个特定的CGSize
,即UILabel
,在这里我无法扩展UILabel
的框架,并且由于它是多行UILabels
,因此 adjustsFontSizeToFitWidth
方法不起作用。
所以我想我应该创建这样的函数:
- (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”的代码的任何帮助或其他建议,都是很好的。
最佳答案
首先,让我们快速查看整个问题。您正在尝试使文本适合预定义的框架并调整字体大小。通常这将无法很好地工作,因为即使在视网膜显示屏上,您也会很快将FAR尺寸打得太小而无法阅读。您应该调整标签的框架以容纳多余的文本(可能的话。有时,截断是唯一的选择。)
现在,这已经不成问题了,让我们来看看调整字体大小。尽管不建议这样做,但我仍将解释如何最好地做到这一点。
重要,此代码未经测试,很可能需要进行一些调整,但这可能是读者的一项练习。
因此,我们需要知道的第一件事是单条线的高度。现在,我们有了标签的高度以及它可以显示的行数,因此我们可以通过简单地将标签高度除以行数来确定。
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的假设开始,然后看看使用该字体大小的单个字符有多高。如果该高度大于先前计算的最佳线条高度,则先前的高度为最佳高度。如果没有,我们将增加大小并重复直到找到最佳值为止。
为了使它在所有情况下都能正常运行,仍然有许多问题需要克服。这应该确保您不会看到可见的字符垂直剪切,但是不能确保所有文本内容都将显示在框架中。为此,您将需要更加智能地确定所需的行数,但是我还是将其作为读者的练习。
希望这可以帮助您实现目标。