我正在使用 CoreAnimation 构建一个由多个图层组成的视图,稍后将对其进行动画处理。还有一些CATextLayer
s 将只包含给定字体的给定大小的一个字符。为了让它漂亮,我想设置图层的边界,以便角色整齐地融入其中。
问题是我必须确定 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
更宽,这对我来说毫无意义,因为字体中的字符通常比宽高,但也许我用错了。
是否有其他方法可以使用此功能?
编辑
是不是我把字符和字形混在一起了?会不会是字体包含代表多个字符的宽字形?