3

我正在使用 CoreAnimation 构建一个由多个图层组成的视图,稍后将对其进行动画处理。还有一些CATextLayers 将只包含给定字体的给定大小的一个字符。为了让它漂亮,我想设置图层的边界,以便角色整齐地融入其中。

问题是我必须确定 a 中最大字符的大小,CGFont这将是文本层边界计算的基础。

在这个关于 SO measure size of each character in a string 的问题中,解释了如何获取每个字符的大小。所以一种解决方案是遍历字体的字符并找出最大的字符。

但是我找到了这个CGFontGetFontBBox功能。文件说_

返回值

字体的边界框。

讨论

字体边界框是 >font 中所有字形的所有边界框的联合。该值以字形空间单位指定。

在我看来,这正是我想要的。一个问题仍然是我必须将字形空间单位转换回像素。我使用以下代码进行了尝试,但结果很奇怪:

/* 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 这样的连字算作单个字形,并且很可能比高更宽。此外,破折号 - 应该与首都高度一样宽。

于 2012-05-03T19:37:41.880 回答