我正在使用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
比更高更宽,这对我来说没有意义,因为字体中的字符通常比较宽,但也许我错了。
是否有替代方法如何使用此功能?
修改
可能是我混合字符和字形吗?可能是字体包含一个代表几个字符的宽字形吗?
答案 0 :(得分:2)
是的,我认为你走在正确的轨道上。例如,诸如ffl之类的连字数计为单个字形,并且很可能比高字宽。此外,em dash - 应该与资本高度一样宽。