3

CoreAnimationを使用して、後でアニメーション化されるいくつかのレイヤーで構成されるビューを作成しています。CATextLayer特定のサイズの特定のフォントの1文字のみを含むsもあります。きれいにするために、キャラクターがきちんと収まるようにレイヤーの境界を設定したいと思います。

CGFont問題は、テキストレイヤーの境界計算の基礎となるaの最大文字のサイズを決定する必要があることです。

文字列内の各文字のサイズを測定するSOに関するこの質問では、各文字のサイズを取得する方法について説明します。したがって、1つの解決策は、フォントの文字を繰り返し処理して、最大の文字を見つけることです。

しかし、私はそのCGFontGetFontBBox機能を見つけました。ドキュメントには

戻り値

フォントのバウンディングボックス。

討論

フォントバウンディングボックスは、フォント内のすべてのグリフのすべてのバウンディングボックスを結合したものです。値はグリフスペース単位で指定されます。

これはまさに私が望んでいることだと私には思えます。グリフ空間の単位をピクセルに変換し直さなければならないという問題が1つ残っています。次のコードで試してみましたが、奇妙な結果が得られます。

/* calculate the bounding box of the biggest character in the font with a given
 * font size
 */
- (CGSize) boundingBoxForFont:(CGFontRef)aFont withSize:(CGFloat)aSize
{
    if (!aFont) {
        CFStringRef fontName = CFStringCreateWithCString(NULL, "Helvetica", CFStringGetSystemEncoding());
        aFont = CGFontCreateWithFontName(fontName);
        CFRelease(fontName);
    }
    CGRect bbox = CGFontGetFontBBox(aFont);
    int units = CGFontGetUnitsPerEm(aFont);
    CGFloat maxHeight = ( CGRectGetHeight(bbox) / (CGFloat) units ) * aSize;
    CGFloat maxWidth = ( CGRectGetWidth(bbox) / (CGFloat) units ) * aSize;
    return CGSizeMake(maxWidth, maxHeight);
}

CGRectのbbox幅が高さよりも広いのは不思議です。フォントの文字は通常幅よりも高さがあるため、私には意味がありませんが、間違って使用している可能性があります。

この関数を使用する方法の代替手段はありますか?

編集

文字とグリフを混同している場合がありますか?フォントに複数の文字を表す幅の広いグリフが含まれている可能性がありますか?

4

1 に答える 1

2

はい、あなたは正しい方向に進んでいると思います。たとえば、fflなどの合字は単一のグリフとしてカウントされ、高さよりも幅が広い可能性があります。また、emダッシュ—大文字の高さと同じ幅であると想定されています。

于 2012-05-03T19:37:41.880 に答える