3

我正在尝试计算出适合定义矩形的字符串的最大字体大小。现在我发现了许多其他说明如何做到这一点的帖子,包括:

调整 UILabel 的大小以适应自动换行

调整 CATextLayer 的大小以适应 iOS 上的文本

iPhone UILabel sizeWithFont:

NSLineBreakByWordWrapping 会中断哪些字符?

现在这些很棒,告诉我如何获得最大的字体大小。然而,当使用“sizeWithFont:constrainedToSize:lineBreakMode:”方法和换行符(UILineBreakModeWordWrap 或 NSLineBreakByWordWrapping)时,它实际上是在多行中拆分大字。

UILineBreakModeWordWrap(或 NSLineBreakByWordWrapping)不是意味着单词不会“拆分”超过一行。我很高兴多个单词出现在多行中,但是我不希望一个单词被分成两个。如果 UILineBreakModeWordWrap 不能做到这一点,还有别的可以吗?

下面是我用来确定最大可能字体大小的代码:(文本为@"australia")

-(UIFont *)GetFontSizeForText:(NSString *)text inRect:(CGRect)rect {
    BOOL notFit = YES;
    CGSize textSize;
    CGFloat tmpFontSize = TEMPLATE_DEFAULT_FONT_SIZE;
    UIFont *tmpFont;    

    CGSize maxSize = CGSizeMake(rect.size.width, MAXFLOAT);

    while (notFit) {
        tmpFont = [UIFont fontWithName:TEMPLATE_DEFAULT_FONT_NAME size:tmpFontSize];
        textSize = [text sizeWithFont:tmpFont constrainedToSize:maxSize lineBreakMode:UILineBreakModeWordWrap];

        if (textSize.height > rect.size.height) {
            tmpFontSize -= 1.0;
            if (tmpFontSize < 2.0) {
                break;
            }
        } else {
            notFit = NO;
        }
    }

    return tmpFont;
}

下面是一个图片链接,显示了使用上述函数计算字体大小时会发生什么。“黄色”框是最大的尺寸。紫色框是使用计算出的字体大小渲染的实际 CATextLayer。这些框上方的“AUSTRALIA”文本是一个UILabel,我将其与界面生成器以相同的字体大小放在此处。

http://www.connstructstudios.com.au/externalimages/multilines.png

4

1 回答 1

2

“换行发生在单词边界,除非单词本身不适合单行。”

因此,如果一个单词太长,可以拆分它。

要解决这个问题,您可以用单词分隔字符串,- (CGSize)sizeWithFont:(UIFont *)font;用于每个组件并检查宽度是否低于最大值。

于 2013-06-12T20:26:28.587 回答