使用CGFontGetGlyphWithGlyphName()绘制数字失败的问题求助
解决CGFontGetGlyphWithGlyphName()无法绘制数字的问题
嘿,这问题我碰到过!你用CGFontGetGlyphWithGlyphName()直接传CFSTR("3")肯定不行——绝大多数字体里数字的字形名称根本不是阿拉伯数字本身,但字母的字形名通常就是它自己(比如"L"对应字形名"L"),所以字母能正常渲染,数字却只会出空白占位符。
问题根源
CGFontGetGlyphWithGlyphName()是根据字体内部的PostScript字形名称来查找字形的,而标准的PostScript字形命名规则里,阿拉伯数字的名称是英文单词:zero、one、two...nine,有些字体还会加后缀(比如带衬线/无衬线的变体)。你直接传"3",字体找不到对应的字形,就会输出空白的缺失字形占位符。
最优解决方案(通用不依赖字体)
别纠结字形名了,用CGFontGetGlyphsForUnichars()直接通过Unicode字符获取字形,这方法对所有字符(字母、数字、符号)都通用,不用管字体的命名规则:
-(void)drawInContext:(CGContextRef)ctx{ CGContextSetAllowsAntialiasing(ctx, true); CGContextSetFont(ctx, font); CGContextSetFontSize(ctx, size); // 直接传入Unicode数字字符 UniChar targetDigit = '3'; CGGlyph glyph; // 从Unicode字符获取对应字形 CGFontGetGlyphsForUnichars(font, &targetDigit, &glyph, 1); CGContextShowGlyphsAtPositions(ctx, &glyph, &(textbounds.origin), 1); }
如果你非要用字形名(不推荐,字体依赖)
如果你坚持要用CGFontGetGlyphWithGlyphName(),得先查目标字体的字形表:
- Mac上可以用FontBook,选中字体后右键→显示字体信息→字形标签,查看数字对应的字形名称
- 或者用第三方工具(比如FontForge)导出字体的字形列表
比如你可能需要传CFSTR("three")而不是CFSTR("3")才能找到对应的字形,但这个方法换个字体就可能失效,非常不通用。
内容的提问来源于stack exchange,提问作者olaf
相关产品推荐
相关产品推荐

