2011-01-20 16 views
8

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?

alt text

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:

alt text

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 è.

+0

Mi chiedo se Helvetica Neue sia un tipo di carattere diverso. –

risposta

4

Probabilmente ha a che fare con le direzioni dei percorsi nei caratteri. Un tipo di carattere può utilizzare percorsi in senso orario; un altro può usare percorsi in senso antiorario.

Un modo più affidabile per ottenere l'effetto desiderato è quello di riempire semplicemente il rettangolo e quindi di estrarre il testo da esso con la modalità di composizione del contesto grafica impostata su NSCompositeSourceOut. Puoi avvolgere il riempimento e il disegno del testo in un livello di trasparenza utilizzando Core Graphics se vuoi tagliare il testo solo fuori dal riempimento.

+0

Brillante, grazie. Questa soluzione funziona molto bene per il mio caso d'uso, anche per Helvetica Neue Bold. Sono ancora molto curioso del perché questo in realtà accade però. Anche all'interno dello stesso font sembrano esserci differenze. Helvetica Neue e Helvetica Neue Bold mostrano entrambi questo comportamento confondente, ma Helvetica Neue Medium no. Spero che qualcuno possa effettivamente spiegare perché questo sta accadendo. Ho esaminato tutti i documenti di programmazione testuale e speravo che NSGlyphGenerator avrebbe dato qualche informazione in più, ma senza fortuna. –

+0

@Ben Dolman: il primo paragrafo della mia risposta spiega la causa probabile e il motivo per cui è specifico del font. –

+0

Quindi Helvetica Neue e Helvetica Neue Medium disegnano in direzioni diverse? So molto poco del disegno del glifo, quindi mi sembra strano. Voodoo, non mi piace. Qualche idea su dove la documentazione per questo comportamento - o anche una panoramica concettuale - esiste? I documenti di programmazione del testo Cocoa non sembrano andare così in profondità nella generazione di glifi. –

Problemi correlati