我从NSAttributedString获取单个字符的字形,然后获取带有appendBezierPathWithGlyphs:count:inFont:
的NSBezierPath,最后将展平的路径点输出到NSArray(请参阅下面的代码),以在Quartz Composer中使用OpenGL显示它们。
对于某些NSFonts,包括标准版(美国打字机,Baskerville,......),字母完全错误(见下图)。
说我正在使用法语键盘和语言可能很重要。
NSBezierPath* path = [NSBezierPath bezierPath];
NSTextStorage *storage = [[[NSTextStorage alloc] initWithString:character] autorelease];
NSLayoutManager *manager = [[[NSLayoutManager alloc] init] autorelease];
NSTextContainer *container = [[[NSTextContainer alloc] init] autorelease];
[storage addLayoutManager:manager];
[manager addTextContainer:container];
NSRange glyphRange = [manager glyphRangeForTextContainer:container];
NSGlyph glyphArray[glyphRange.length];
NSUInteger glyphCount = [manager getGlyphs:glyphArray range:glyphRange];
[manager getGlyphs:glyphArray range:glyphRange];
// ---- Necesary
[path moveToPoint: NSMakePoint(0, 0)];
// STRANGE CHARACTERS
[path appendBezierPathWithGlyphs:glyphArray count:glyphCount inFont:selectedFont];
有人知道这种行为的解释吗?是否有使用这些字体获得正确路径的解决方案?
答案 0 :(得分:2)
问题是您没有为-appendBezierPathWithGlyphs:count:inFont:
中使用的字体生成字形。由于您未将NSFontAttributeName
属性设置为NSTextStorage
,因此使用默认字体生成字形。
使用正确的字体创建NSTextStorage
,您的问题将得到解决:
NSTextStorage *storage = [[[NSTextStorage alloc] initWithString:character
attributes:@{NSFontAttributeName : selectedFont}] autorelease];