CGFont:计算字形边界

问题描述:

如何获取像素中字符串的每个字形的大小? 我用CGFontGetGlyphBBoxes得到字符串每个字形的边界框,并得到以下值:CGFont:计算字形边界

2011-04-18 15:34:56.809 TextSize[3604:207] bbox['d'] = {{56, -38}, {949, 1512}} 
2011-04-18 15:34:56.811 TextSize[3604:207] bbox['e'] = {{72, -38}, {978, 1135}} 
2011-04-18 15:34:56.811 TextSize[3604:207] bbox['m'] = {{132, 0}, {1441, 1095}} 
2011-04-18 15:34:56.812 TextSize[3604:207] bbox['o'] = {{59, -39}, {998, 1141}} 

如果我有正确的认识,这些值在字体单位提出。这些值究竟意味着什么,我如何将它转换为像素? CGFontGetGlyphAdvances和CGFontGetGlyphBBoxes返回的值有什么区别?使用CGFontGetGlyphAdvances我得到如下:

2011-04-18 15:34:56.809 TextSize[3604:207] advance['d'] = 1139, bbox = {{56, -38}, {949, 1512}} 
2011-04-18 15:34:56.811 TextSize[3604:207] advance['e'] = 1139, bbox = {{72, -38}, {978, 1135}} 
2011-04-18 15:34:56.811 TextSize[3604:207] advance['m'] = 1706, bbox = {{132, 0}, {1441, 1095}} 
2011-04-18 15:34:56.812 TextSize[3604:207] advance['o'] = 1139, bbox = {{59, -39}, {998, 1141}} 

举例来说,如果我想计算字符串的整个宽度(在我的情况“演示”),我应该用什么样的价值观(bbox.size.width或提前) ?

对我来说有效的是为每个字形加上先行值。我不认为边界框会在字形之间包含适当的间距。

您可以通过调用获得对提前转换为EM值:

CGFontGetUnitsPerEm(cgfont); 

从,你可以通过与字体大小相乘得到的像素。不过,我们不能完全确定这是否能在所有可能的情况下发挥作用。