2011-04-18 166 views
1

如何獲取像素中字符串的每個字形的大小? 我用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或提前) ?

回答

0

對我來說有效的是爲每個字形加上先行值。我不認爲邊界框會在字形之間包含適當的間距。

您可以通過調用獲得對提前轉換爲EM值:

CGFontGetUnitsPerEm(cgfont); 

從,你可以通過與字體大小相乘得到的像素。不過,我們不能完全確定這是否能在所有可能的情況下發揮作用。