私がしたいのは、塗りつぶし矩形を取り、別の形を使ってそれに穴を開けることです。これはちょうどNSBezierPath
が設計されている種類のものです。長方形のパスを追加し、そのパスを「パンチ」して最後にそれを塗りつぶすサブパスを追加します。私の場合、サブパスは実際にテキストです。いいえ問題は、素晴らしい作品なかっ:Helvetica Neue BoldグリフがNSBezierPathの通常のサブパスとして描画されないのはなぜですか?
私は私のフォントの太字ヘルベチカノイエを使用する場合を除き。私がそれを使うと、テキストなしの実線の青い矩形で終わるだけです。
私はヘルベチカノイエ斜体で同じ動作を得る:私は少し満たされた長方形を縮小した場合、あなたは実際にはテキストパスの一部を見ることができ、実際には - しかし、サブパスは確かに描画されます。 Helvetica Bold、Times New Roman Bold、Arial Boldなど、Helvetica Neue Mediumはうまく動作します。私はNSEvenOddWindingRule
とNSNonZeroWindingRule
の両方を使ってみました。 (EDIT:どうやら私は本当にそれがすべての後に動作が判明しないため、NSEvenOddWinding
ルールをしようとしなかった)これは私が私のNSView
サブクラスのdrawRect
メソッド内で使用しているコードです
。
NSLayoutManager *layoutManger = [[[NSLayoutManager alloc] init] autorelease];
NSTextContainer *textContainer = [[[NSTextContainer alloc]
initWithContainerSize:NSMakeSize(300, 100)] autorelease];
NSFont *font = [NSFont fontWithName:@"Helvetica Neue Bold" size:100];
NSDictionary *textAttribs = [NSDictionary dictionaryWithObjectsAndKeys:
font, NSFontAttributeName, nil];
NSTextStorage *textStorage = [[[NSTextStorage alloc] initWithString:@"Hello"
attributes:textAttribs] autorelease];
[layoutManger addTextContainer:textContainer];
[layoutManger setTextStorage:textStorage];
NSRange glyphRange = [layoutManger glyphRangeForTextContainer:textContainer];
NSGlyph glyphArray[glyphRange.length];
NSUInteger glyphCount = [layoutManger getGlyphs:glyphArray range:glyphRange];
NSBezierPath *path = [NSBezierPath bezierPathWithRect:NSMakeRect(0, 0, 200, 100)];
[path appendBezierPathWithGlyphs:glyphArray count:glyphCount inFont:font];
[[NSColor blueColor] setFill];
[path fill];
ここでは何が起こっているのですか?グリフをパスに追加する際に、一部のフォントが他と動作が異なるのはなぜですか?
EDIT:解決策は、NSEvenOddWindingRule
です。 path
の作成後に次の行を追加します。
[path setWindingRule:NSEvenOddWindingRule];
ピーターHoseyの答えはこれが理由の説明を提供します。
Helvetica Neueが別の種類のフォントであるのかなと思います。 –