1

我有一个特定CGSize的 a 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”的任何其他建议都会很棒。

4

1 回答 1

6

首先让我们快速看一下整个问题。您正在尝试将文本放入预定义的框架并调整字体大小。这通常不会很好地工作,因为你会很快找到尺寸太小而无法阅读,即使在视网膜显示器上也是如此。您应该调整标签的框架以容纳多余的文本(在可能的情况下。有时,截断是唯一的选择。)

现在,这已经不碍事了,让我们来看看调整字体大小。尽管不推荐它,但我仍然会解释如何最好地去做。

重要的是,此代码未经测试,很可能需要一些调整,但这可能是读者的练习。

所以我们首先需要知道的是单行的高度。现在,我们有了标签的高度,以及它可以显示的行数,所以我们可以通过简单地将标签高度除以行数来确定这一点。

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 );

那么这有什么作用呢?到目前为止,我们在此跟踪最佳字体大小。我们从字体大小为 0 的假设开始,我们看到使用该字体大小的单个字符有多高。如果该高度大于先前计算的最佳线高,则先前的高度是最佳高度。如果不是,我们增加大小并重复,直到我们找到最佳的。

在这方面仍有很多问题需要克服,以使其在所有情况下都能完美运行。这应该确保您看不到字符的可见垂直剪切,但不能确保所有文本内容都显示在框架中。要做到这一点,您需要更聪明地确定所需的行数,但我再次将其留作读者练习。

希望这可以帮助您实现目标。

于 2013-02-10T14:17:22.157 回答