2011-02-11 4 views
5

Ho letto ciò che ritengo essere le parti rilevanti della Guida di programmazione 2D di Quartz, ma non riesco a trovare una risposta a quanto segue (non sembrano parlare molto su iOS nel documento):Come creare un CGLayer da un UIView per il disegno fuori schermo

La mia applicazione visualizza un disegno in un UIView. Ogni tanto devo aggiornare il disegno in qualche modo, ad es. cambia il colore di riempimento di una delle forme (tengo CGPathRefs alle forme importanti per poterle ridisegnare con un colore di riempimento diverso in seguito). Come descritto nella sezione "disegno con una CGLayer" a pagina 169 del documento citato, stavo pensando di disegnare l'intero disegno in un CGContext che avrei ottenere da un CGLayer, in questo modo:

CGContextRef offscreenContext = CGLayerGetContext(offscreenLayer); 

Poi ho potrebbe fare il mio aggiornamento fuori dallo schermo nella CGContext e disegnare la CGLayer nel mio UIView in drawRect s' il UIView: metodo, in questo modo:

CGContextDrawLayerAtPoint(viewContext, CGPointZero, offscreenLayer); 

il problema che sto avendo è, dove posso avere il mio CGLayer da ? La mia comprensione è che devo farlo usando CGLayerCreateWithContext e fornire un CGContext come parametro da cui eredita la maggior parte delle sue proprietà. Ovviamente, il contesto giusto sarebbe il contesto della UIView, che sto ottenendo con

CGContextRef viewContext = UIGraphicsGetCurrentContext(); 

ma se non mi sbaglio, posso solo ottenere che all'interno del drawRect: metodo e non è valida per ritenere che il contesto che mi viene dato sarà lo stesso la prossima volta che viene chiamato il metodo, cioè posso usare solo quello CGContext localmente all'interno del metodo.

Così, come posso ottenere un CGContext che posso usare per inizializzare il mio CGLayer per creare un fuori campo CGContext per disegnare in e quindi disegnare l'intero livello di nuovo in s' CGContext miei UIView?

PS: Mentre ci sei; se qualcosa di cui sopra non ha senso o non è sano, per favore fatemelo sapere. Sto appena iniziando a girare la testa su Quartz 2D.

risposta

1

Prima di tutto, se lo fai da un ambiente iOS, penso che tu abbia ragione. La documentazione ha detto chiaramente che l'unico modo per ottenere un CGContextRef è di

CGContextRef ctx = UIGraphicGetCurrentContext(); 

quindi si utilizza tale contesto per la creazione del CGLayer con

CGLayerRef layer = CGLayerCreateWithContext(ctx, (CGSize){0,0}, NULL); 

E, se si vuole attingere a quel livello, avete disegnarlo con il contesto che si ottiene dal livello. (È un po 'diverso dal contesto passato in precedenza per creare il CGLayer). Immagino che lo CGLayerCreateWithContext salvi le informazioni che può ottenere dal contesto passato, ma non tutto. (Uno degli esempi è le informazioni ColorSpace, è necessario specificare nuovamente quando si riempie qualcosa con il contesto da CGLayer).

È possibile ottenere il riferimento al contesto CGLayer dalla funzione CGLayerGetContext() e utilizzarlo per disegnare.

CGContextRef layerCtx = CGLayerGetContext(layer); 
CGContextBeginPath(layerCtx); 
CGContextMoveToPoint(layerCtx, -10, 10); 
CGContextAddLineToPoint(layerCtx, 100, 10); 
CGContextAddLineToPoint(layerCtx, 100, 100); 
CGContextClosePath(layerCtx); 

Un punto che ho scoperto è quando si disegna qualcosa fuori campo, si aggancia automaticamente la cosa fuori campo. (ha senso, quindi non disegna cose che non si vedono) ma quando si sposta il livello (usando la trasformazione della matrice). Il percorso troncato non viene mostrato (mancante).

Un'ultima cosa, se si salva il riferimento ad uno strato in una variabile e più tardi si vuole disegnare, è possibile utilizzare CGContextDrawLayerAtPoint() metodo come

CGContextDrawLayerAtPoint(ctx, (CGPoint) {newPointX, newPointY}, layer); 

Sarà sorta di "stampt" o " disegnare "il livello in quel nuovo punto di riferimento e una nuova coordinata PointY.

Spero che risponda alla tua domanda, se non è per favore fammi sapere.

+0

Sono anche bloccato con il problema CGLayer, non sto capendo come scriverlo nelle mie funzioni touchedmoved, puoi per favore dare un'occhiata al mio post http://stackoverflow.com/questions/11341763/how-to- use-cglayer-for-optimal-drawing – Ranjit

+0

CGContextBeginPath() e CGContextClosePath() accettano un parametro del contesto. – Ant

Problemi correlati