使用 Core Text 获取字形名称

Emi*_*iel 2 macos core-text

对于一个小型副项目,我需要在字体中提供所有可用的字形名称。所以,我想这样做:

CTFontRef f = CTFontCreateWithName(CFSTR("Zapfino"), 40, NULL);

CFIndex count = CTFontGetGlyphCount(f);
printf("There are %ld glyphs\n", count);

for (CGGlyph i = 1; i < count + 1; i++)
{
    CTGlyphInfoRef gi = CTGlyphInfoCreateWithGlyph(i, f, CFSTR("(c)"));
    CFStringRef name = CTGlyphInfoGetGlyphName(gi);
    CGFontIndex idx = CTGlyphInfoGetCharacterIdentifier(gi);

    printf("Glyph: %4hu, idx: %4hu ", i, idx);
    CFShow(name);
    printf("\n");

}
Run Code Online (Sandbox Code Playgroud)

创建字体并获取字形计数效果很好。但字形的名称始终为 NULL。CTGlyphInfoRef 变量“gi”获取一个值。有什么想法吗?我在这里缺少什么?

Ken*_*ses 5

你误解了它CTGlyphInfo的意思。这不是查询字形信息的方法。它是用字形替换字符串的表示。您可以将字形信息对象设置为kCTGlyphInfoAttributeName属性字符串中属性的值。如果文本与基本字符串匹配,则该字形将替换该范围的属性文本。

您可以使用CGFontCopyGlyphNameForGlyph()从字体获取字形的名称。CGFontRef您可以直接使用函数创建CGFontCreate...()CTFont您还可以使用 using来创建一个CTFontCopyGraphicsFont()