1

テキストが収まるように自動的に縮小されるUILabelがあります。これが発生したら、別のラベルでまったく同じサイズを設定できるように、結果のフォントのポイントサイズを知る必要があります。

label.font.pointSizeにアクセスすると、縮小されたサイズではなく、元のサイズに戻ります。そこで、このNSStringの追加を使用して、フォントサイズを計算してみました。

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

ただし、ラベルの高さの制約を考慮しない場合は幅のみを考慮するため、これも機能しません。(私の場合、フレームの高さに合わせるためにフォントをさらに縮小する必要があります)。

これは私に絶対に恐ろしいオプションを1つだけ残しているようです。それは、実際にフレームに収まる最大の高さが見つかるまで、次の関数を繰り返し呼び出すことです。

- (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 に答える