测量CGFont中最大字符的尺寸

时间:2012-05-03 18:51:06

标签: objective-c fonts core-graphics

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

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

在关于SO measure size of each character in a string的这个问题中,解释了如何获得每个角色的大小。因此,一种解决方案是迭代字体的字符并找出最大的字符。

但是我找到了CGFontGetFontBBox功能。 documentation

  

返回值

     

字体的边界框。

     

讨论

     

字体边界框是>字体中所有字形的所有边界框的并集​​。该值以字形空间单位指定。

这听起来对我来说这正是我想要的。一个问题仍然是我必须将字形空间单位转换回像素。我尝试使用以下代码,但它给出了奇怪的结果:

/* 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比更高更宽,这对我来说没有意义,因为字体中的字符通常比较宽,但也许我错了。

是否有替代方法如何使用此功能?

修改

可能是我混合字符和字形吗?可能是字体包含一个代表几个字符的宽字形吗?

1 个答案:

答案 0 :(得分:2)

是的,我认为你走在正确的轨道上。例如,诸如ffl之类的连字数计为单个字形,并且很可能比高字宽。此外,em dash - 应该与资本高度一样宽。