1

我有一个 UILabel,其中的文本会自动缩小以适应。一旦发生这种情况,我需要知道生成字体的磅值,以便我可以在别处的另一个标签中设置完全相同的大小。

如果我访问 label.font.pointSize 我会返回原始大小,而不是缩小后的大小。所以我然后尝试使用这个 NSString 添加来计算字体大小:

- (CGSize)sizeWithFont:(UIFont *)font minFontSize:(CGFloat)minFontSize actualFontSize:(CGFloat *)actualFontSize forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode

但是,这对我也不起作用,因为 if 没有考虑标签的高度约束,只考虑它的宽度。(在我的情况下,字体需要进一步缩小以适应框架的高度)。

这似乎给我留下了一个绝对可怕的选择,那就是反复调用以下函数,直到我找到实际适合框架的最大高度:

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode

显然,这将是非常低效和讨厌的。

有没有人有更好的解决方案?

蒂姆

4

1 回答 1

2

好吧,在没有人可以为我提供更好的选择的情况下,我想我会分享一个我为解决问题而编写的类别。

但是,如果有一种直接的方法可以访问 UILabel 的缩小字体大小,那显然是理想的......

事不宜迟,此函数将返回适合约束大小的自动缩小字体大小。

界面:

 @interface NSString (FontSize)

- (CGSize)sizeWithFont:(UIFont *)font
           minFontSize:(CGFloat)minFontSize
        actualFontSize:(CGFloat *)actualFontSize
     constrainedToSize:(CGSize)maxSize
         lineBreakMode:(UILineBreakMode)lineBreakMode;

@end

执行:

@implementation NSString (FontSize)

- (CGSize)sizeWithFont:(UIFont *)font
           minFontSize:(CGFloat)minFontSize
        actualFontSize:(CGFloat *)actualFontSize
     constrainedToSize:(CGSize)maxSize
         lineBreakMode:(UILineBreakMode)lineBreakMode
{
    CGFloat size;
    CGSize boundingBox;

    // First, get the OS to fit the text into the width

    boundingBox = [self sizeWithFont:font
                         minFontSize:minFontSize
                      actualFontSize:&size
                            forWidth:maxSize.width
                       lineBreakMode:lineBreakMode];

    // Return here if the min size has already been reached

    if (size <= minFontSize)
    {
        *actualFontSize = size;
        return boundingBox;
    }

    // Binary search biggest size that will fit within the height of the box    

    CGFloat upperBound = size;
    CGFloat lowerBound = minFontSize;

    UIFont *f;
    CGFloat fontSize;
    while (upperBound > lowerBound + 0.5) {

        fontSize = (upperBound + lowerBound) / 2;

        f = [UIFont fontWithName:font.fontName size:fontSize];
        boundingBox = [self sizeWithFont:f];

        if (boundingBox.height > maxSize.height)
            upperBound = fontSize - 0.5;
        else
            lowerBound = fontSize;
    }

    // Return the result

    *actualFontSize = fontSize;
    return boundingBox;
}

@end 
于 2012-10-03T11:40:29.033 回答