Я хочу взять заполненный прямоугольник и пробить в нем отверстие, используя другую форму.Это именно то, для чего предназначена NSBezierPath
.Вы добавляете прямоугольный путь, затем добавляете подпуть, который будет «пробивать» его и, наконец, заполнять.В моем случае подпуть на самом деле текстовый.Нет проблем, отлично работает:
За исключением случаев, когда я использую Helvetica Neue Bold для своего шрифта.Когда я использую это, я просто получаю сплошной синий прямоугольник без текста вообще.Но подпуть действительно рисует - на самом деле, если я немного уменьшу закрашенный прямоугольник, вы можете увидеть часть текстового пути:с Helvetica Neue Italic.Helvetica Neue Medium отлично работает, как и Helvetica Bold, Times New Roman Bold и Arial Bold.
Я пытался использовать NSEvenOddWindingRule
и NSNonZeroWindingRule
.( РЕДАКТИРОВАТЬ : По-видимому, я действительно не пробовал правило NSEvenOddWinding
, потому что оно, в конце концов, работает* метод моего NSView
подкласса.
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];
Ответ Питера Хоси дает объяснение, почему это так.