Quello che voglio è prendere un rettangolo pieno e perforare un buco usando un'altra forma. Questo è esattamente il tipo di cosa per cui è stato progettato lo standard NSBezierPath
. Aggiungi un tracciato rettangolare, quindi aggiungi il sottotracciato che "punterà" attraverso di esso e infine lo riempirà. Nel mio caso il sottotracciato è in realtà testo. Nessun problema, funziona alla grande:Perché i glifi di Helvetica Neue Bold non disegnano come un normale sottotracciato in NSBezierPath?
Tranne quando uso Helvetica Neue in grassetto per il mio carattere. Quando lo uso, mi ritrovo con un rettangolo blu senza alcun testo. Ma la sottotracciato è infatti disegno - infatti, se rifuggo il rettangolo riempito un po ', si può effettivamente vedere alcuni dei percorso di testo:
ottengo lo stesso comportamento con Helvetica Neue italica. Helvetica Neue Medium funziona bene, così come Helvetica Bold, Times New Roman Bold e Arial Bold.
Ho provato a utilizzare sia NSEvenOddWindingRule
e NSNonZeroWindingRule
. (EDIT: A quanto pare non ho davvero provare NSEvenOddWinding
regola, perché questo non risultano al lavoro dopo tutto)
Questo è il codice che sto usando all'interno del metodo della mia NSView
sottoclasse 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];
Quindi cosa sta succedendo qui? Perché alcuni tipi di carattere si comportano in modo diverso rispetto ad altri quando si tratta di aggiungere glifi a un percorso?
MODIFICA: la soluzione è utilizzare NSEvenOddWindingRule
. Dopo la creazione di path
aggiungere questa linea: la risposta di
[path setWindingRule:NSEvenOddWindingRule];
Peter Hosey fornisce la spiegazione del perché questo è.
Mi chiedo se Helvetica Neue sia un tipo di carattere diverso. –