2011-02-11 9 views
5

He leído lo que creo que son las partes relevantes de la Guía de programación 2D de Quartz, pero no puedo encontrar una respuesta a lo siguiente (no parecen hablar mucho sobre iOS en el documento):Cómo crear un CGLayer desde un UIView para el dibujo fuera de la pantalla

Mi aplicación muestra un dibujo en un UIView. De vez en cuando tengo que actualizar el dibujo de alguna manera, p. cambie el color de relleno de una de las formas (guardo CGPathRefs en las formas importantes para poder volver a dibujarlas con un color de relleno diferente más adelante). Según se describe en la sección "Cómo dibujar con un CGLayer" en la página 169 del documento antes mencionado, que estaba pensando en el dibujo el dibujo completo en un CGContext que iba a obtener de un CGLayer, así:

CGContextRef offscreenContext = CGLayerGetContext(offscreenLayer); 

Entonces podría hacer mi actualización fuera de la pantalla en el CGContext y dibujar la CGLayer en mi UIView en drawRect la UIView 's: método, así:

CGContextDrawLayerAtPoint(viewContext, CGPointZero, offscreenLayer); 

el problema que estoy teniendo es, dónde consigo mi CGLayer de ? Según tengo entendido, debo hacerlo utilizando CGLayerCreateWithContext y suministrar un CGContext como un parámetro del cual hereda la mayoría de sus propiedades. Obviamente, el contexto adecuado sería el contexto de la UIView, que me estoy haciendo con

CGContextRef viewContext = UIGraphicsGetCurrentContext(); 

pero si no me equivoco, sólo puedo conseguir que dentro de la drawRect: método y no es válido suponer que el contexto que se me da será el mismo la próxima vez que se llame al método, es decir, solo puedo usar ese CGContext localmente dentro del método.

Entonces, ¿cómo puedo obtener una CGContext que puedo utilizar para inicializar mi CGLayer para crear un fuera de la pantalla para dibujar en CGContext y luego dibujar la capa entera de nuevo en mis UIView 's CGContext?

PD: Mientras lo hace; si algo anterior no tiene sentido o no está cuerdo, házmelo saber. Estoy comenzando a mover mi cabeza alrededor de Quartz 2D.

Respuesta

1

En primer lugar, si lo haces en un entorno iOS, creo que tienes razón. La documentación dice claramente que la única manera de obtener una CGContextRef es por

CGContextRef ctx = UIGraphicGetCurrentContext(); 

continuación, utiliza ese contexto para la creación de la CGLayer con

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

Y si desea dibujar en esa capa, que tiene dibujarlo con el contexto que obtienes de la capa. (Es algo diferente del contexto que pasaste antes para crear CGLayer). Supongo que el CGLayerCreateWithContext guarda la información que puede obtener del contexto pasado, pero no todo. (Uno de los ejemplos es la información de ColorSpace, debe volver a especificar cuándo completa algo con el contexto del CGLayer).

Puede obtener la referencia de contexto CGLayer de la función CGLayerGetContext() y usar eso para dibujar.

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

Un punto que descubrí es cuando se dibuja algo fuera de la pantalla, automáticamente clips de la cosa fuera de la pantalla. (tiene sentido, por lo que no dibuja cosas que no se ven), pero cuando mueves la capa (usando la transformación de la matriz). La ruta recortada no se muestra (falta).

Una última cosa, si guarda la referencia a una capa en una variable y posteriormente desea dibujar, puede utilizar CGContextDrawLayerAtPoint() método como

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

Será especie de "stampt" o " dibuja "la capa en ese nuevo PointX y nueva coordenada PointY.

Espero que responda a su pregunta, si no es así por favor hágamelo saber.

+0

También estoy atascado con el problema de CGLayer, no entiendo cómo escribir en mis funciones tocadas, ¿puedes echar un vistazo a mi publicación http://stackoverflow.com/questions/11341763/how-to- use-cglayer-for-optimal-drawing – Ranjit

+0

CGContextBeginPath() y CGContextClosePath() toman un parámetro del contexto. – Ant

Cuestiones relacionadas