2010-06-09 11 views
5

Ho un'applicazione in cui sto facendo un disegno personalizzato, un gruppo di linee su uno sfondo sfumato, in questo modo (ignora il testo, sono solo UILabels) :Disegno grafica personalizzata su iPhone: CALayer vs CGContext

http://prehensile.co.uk/outgoing/Screenshot2010-06-09at12.22.32.png

al momento, questo è tutto fatto da iniziare un nuovo CGContext, disegno roba in esso con CGContextDrawLinearGradient e CGContextStrokePath, infine salvare l'immagine risultante con UIGraphicsGetImageFromCurrentImageContext. Le informazioni di posizionamento sono calcolate mentre sto impostando quelle etichette, quindi sarebbe una PITA (e una duplicazione di sforzi) per calcolarlo di nuovo quando l'UIView che contiene è disegnato con drawRect, quindi lo sto disegnando prima di tempo in una UIImmagine. Tutto funziona bene, finora tutto bene.

Tuttavia, ho un vago sospetto che potrebbe essere più efficiente utilizzare CALayers per fare questo disegno. La mia comprensione (superficiale) della differenza tra i due approcci è che un CALayer è più simile a un mucchio di istruzioni per disegnare cose, e quindi occupa meno memoria finché non viene effettivamente disegnato sullo schermo, mentre disegnare tutto in una UIImage in anticipo significa che hai una fantastica bitmap che ti dà sempre un'occhiata nella memoria, che sia disegnata o meno.

È una comprensione corretta? Qual è generalmente considerato il modo migliore per disegnare immagini personalizzate su iPhone?

risposta

1

piuttosto tardi, ma forse sarà utile.

CA è uno strato superiore di astrazione rispetto a CG, quindi praticamente tutto ciò che si fa in CA sarà implementato in CG, ma ci sono alcuni vantaggi in cui l'elaborazione avverrà al momento del rendering e si risparmia la memoria .

Per i tracciati che si disegna, è possibile utilizzare un CAShapeLayer e impostare i colori del tracciato e del tratto quando si esegue il layout. Ogni CAShapeLayer ha il proprio stile di tracciato, quindi, dal momento che sembra che tu stia usando delle linee bianche e diversi spessori di nero, ogni diverso stile di linea avrebbe bisogno di un CAShapeLayer separato.

Per il gradiente lineare, è possibile creare un'immagine 1x50 e lasciare che un CALAYer estenda tale larghezza alla larghezza richiesta al momento del rendering. Imposta i contenuti di un CALayer su CGImageRef e in qualsiasi modo si tratti di estendere i contenuti.

I CALAYER sarebbero una chiara vittoria per l'impronta della memoria; il tempo di elaborazione non è mai ovvio; le immagini pre-renderizzate potrebbero ancora vincere lì.

0

È possibile creare un livello per disegnare un'immagine, quando l'immagine è cambiata o ogni volta che si desidera modificare il disegno corrente, utilizzare [layer setNeedsDisplay], questo renderà il livello ridisegnare il contenuto.

tramite metodo di cui sopra, è possibile ridisegnare immagine di tua scelta, non disegnare risposta ancora e ancora

Problemi correlati