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.
Fantastico, grazie! 'CGContextSetFillColorWithColor (context, [UIColor whiteColor] .CGColor);' –
grande spiegazione grazie –
Ottima spiegazione, molto utile. – CVertex