2011-05-26 11 views
5

Tengo el siguiente código:dibujar CALayer en un CGContext

CGContextRef context = UIGraphicsGetCurrentContext(); 

CGContextSaveGState(context); 

CALayer *sublayer = [CALayer layer]; 
sublayer.backgroundColor = [UIColor orangeColor].CGColor; 
sublayer.cornerRadius = 20.0; 
sublayer.frame = CGRectMake(20, 0, 300, 20); 

[sublayer setNeedsDisplay]; 
[sublayer drawInContext:context]; 

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 

return newImage; 

Pero cuando veo el retorno newImage, sólo hay una imagen vacía. Cuando cambio drawInContext para renderInContext, entonces obtuve la subcapa anterior, pero parece que el sistema de coordenadas está desordenado.

¿Alguna idea de por qué drawInContext en lo anterior no funcionó?

Respuesta

3

El sistema de coordenadas no está dañado, per se. Quartz usa un sistema de coordenadas diferente que UIKit. En Cuarzo, el eje Y se origina en la esquina inferior izquierda del rectángulo de encuadre. Los valores se hacen más grandes a medida que avanzas más "hacia arriba" en el rectángulo. Para una representación visual, consulte la documentación en

http://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/drawingwithquartz2d/dq_overview/dq_overview.html

Esto difiere de UIKit de origen del sistema de coordenadas que UIKit es la parte superior izquierda con los valores del eje y cada vez más positiva a medida que viajan "hacia abajo".

En cuanto a por qué drawInContext: no funciona, también debe hacer referencia a los documentos para la clase CALayer donde dice: "La implementación predeterminada no hace nada".

http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html

2

Trate de usar renderInContext en lugar de drawInContext.

Mi entendimiento es que drawInContext está allí para ser reemplazado, mientras que renderInContext se utiliza para representar el contenido de una capa en el contexto.

De the documentation:

- drawInContext:

La implementación predeterminada de este método no hacer ningún dibujo en sí. Si el delegado de la capa implementa el método drawLayer:inContext:, se llama a ese método para hacer el dibujo real.

Las subclases pueden anular este método y usarlo para dibujar el contenido de la capa. Al dibujar, todas las coordenadas deben especificarse en puntos en el espacio de coordenadas lógicas.


- renderInContext:

Este método hace directamente desde el árbol de capas, ignorando cualquier animaciones añadido al árbol de procesamiento. Renders en el espacio de coordenadas de la capa.