2010-09-18 18 views
8

Ho uno UIView impostato su opaque = NO e tutto funziona perfettamente. Nel drawRect sto facendo disegno personalizzato, e questo funzionaSolo colore di riempimento bianco è trasparente in UIView

CGContextSetFillColor(context, CGColorGetComponents([UIColor blueColor].CGColor)); 
CGContextFillRect(context, labelOutside); 
CGContextAddRect(context, labelOutside); 

ma questo

CGContextSetFillColor(context, CGColorGetComponents([UIColor whiteColor].CGColor)); 
CGContextFillRect(context, labelOutside); 
CGContextAddRect(context, labelOutside); 

risultati in NO riempimento in produzione (si può anche vedere altre cose che ho disegnato sulla CGContext attraverso di essa). Come posso disegnare un riempimento bianco?

Nota: Se si imposta il controllo non è opaco, non funziona ancora.

risposta

17

Perché non utilizzare CGContextSetFillColorWithColor? Quindi è possibile passare direttamente l'oggetto CGColor invece di estrarne i componenti e supponendo che si trovi nello stesso spazio colore del contesto.

A cura di aggiungere:

questo funziona

CGContextSetFillColor(context, CGColorGetComponents([UIColor blueColor].CGColor)); 

ma questo

CGContextSetFillColor(context, CGColorGetComponents([UIColor whiteColor].CGColor)); 

risultati in NO riempimento in fase di produzione (si può anche vedere altre cose che ho disegnato sulla CGContext attraverso di essa).

Come ho già detto, questo modo di impostare il colore di riempimento presuppone che il colore si trovi nello stesso spazio colore del contesto.

Normalmente, la maggior parte dei CGContexts si trova in uno spazio colore RGB. whiteColor, d'altra parte, è quasi certamente in uno spazio colore bianco, che ha solo uno o due componenti (bianco e alfa).

Quindi, poiché il contesto è in uno spazio colore RGB, CGContextSetFillColor prevede di passare tre o quattro componenti (rosso, verde, blu e alfa). Quando si ottengono i componenti del CGColor di whiteColor, si ottiene un puntatore a un array C che contiene solo due componenti. CGContextSetFillColor leggerà i tre o quattro componenti che vuole, non importa cosa; se passi di meno, potrebbe trovare spazzatura dopo di loro, o potrebbe trovare zero.

Se trova uno zero nella posizione alfa, il risultato è che il colore di riempimento è stato impostato su qualcosa tra il giallo (rosso = 1.0, verde = 1.0, blu = 0.0) e bianco (tutti e tre = 1.0) con zero alfa. Questo è il motivo per cui il riempimento non viene visualizzato: si sta riempiendo con un colore trasparente.

Il problema è la mancata corrispondenza tra lo spazio cromatico in cui si trova il contesto (con tre o quattro componenti) e lo spazio cromatico in cui si trova il colore (con uno o due componenti). La soluzione è rimuovere la mancata corrispondenza, che è ciò che fa CGContextSetFillColorWithColor: Poiché si passa l'intero oggetto CGColor, non solo una serie di numeri, Core Graphics sarà in grado di impostare lo spazio cromatico del contesto su quello dell'oggetto colore e interpretare il i componenti dell'oggetto colore correttamente.

+2

Fantastico, grazie! 'CGContextSetFillColorWithColor (context, [UIColor whiteColor] .CGColor);' –

+0

grande spiegazione grazie –

+0

Ottima spiegazione, molto utile. – CVertex

Problemi correlati