对于某些标准字体,NSString为NSBezierPath奇怪的字形

时间:2014-03-25 10:05:59

标签: objective-c macos fonts bezier nsbezierpath

我从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];

With Arial With Baskerville 有人知道这种行为的解释吗?是否有使用这些字体获得正确路径的解决方案?

1 个答案:

答案 0 :(得分:2)

问题是您没有为-appendBezierPathWithGlyphs:count:inFont:中使用的字体生成字形。由于您未将NSFontAttributeName属性设置为NSTextStorage,因此使用默认字体生成字形。

使用正确的字体创建NSTextStorage,您的问题将得到解决:

NSTextStorage *storage = [[[NSTextStorage alloc] initWithString:character
                                                     attributes:@{NSFontAttributeName : selectedFont}] autorelease];