CGContext vs CALayer

Estoy tratando de controlar Quartz 2D y mirar el libro en línea Quartz 2D Graphics para Mac OS X Developers .

Una cosa muy básica que me está confundiendo es el CGContext. Por ejemplo, puedo dibujar una forma simple de "U" con el código de abajo y usarla en un CAShapeLayer sin hacer reference a un CGContext . ¿El context está implícito / provisto por defecto por el CAShapeLayer ?

Probablemente estoy mezclando varias API de charts iOS / OSX aquí, así que quizás alguien pueda aclarar dónde me equivoco.

 CGPoint pt1 = CGPointMake(100, 100); CGPoint pt2 = CGPointMake(150, 100); CGPoint pt3 = CGPointMake(150, 200); CGPoint pt4 = CGPointMake(190, 200); CGPoint pt5 = CGPointMake(190, 100); CGPoint pt6 = CGPointMake(210, 100); CGPoint pt7 = CGPointMake(210, 250); CGPoint pt8 = CGPointMake(100, 250); CGPoint pt9 = CGPointMake(100, 100); CGMutablePathRef path = CGPathCreateMutable(); CGPathMoveToPoint(path, nil, pt1.x,pt1.y); CGPathAddLineToPoint(path, nil, pt2.x, pt2.y); CGPathAddLineToPoint(path, nil, pt3.x, pt3.y); CGPathAddLineToPoint(path, nil, pt4.x, pt4.y); CGPathAddLineToPoint(path, nil, pt5.x, pt5.y); CGPathAddLineToPoint(path, nil, pt6.x, pt6.y); CGPathAddLineToPoint(path, nil, pt7.x, pt7.y); CGPathAddLineToPoint(path, nil, pt8.x, pt8.y); CGPathAddLineToPoint(path, nil, pt9.x, pt9.y); CAShapeLayer *shapeLayer = [CAShapeLayer layer]; [self.view.layer addSublayer:shapeLayer]; 

Sí, el CAShapeLayer dibujará el path en un context para usted.

Tenga en count que con CAShapeLayer, usa CG Path , mientras que si está dibujando en un context usted mismo, puede usar las propias funciones de dibujo de ruta del CG Context .

La mayor diferencia es que las funciones de la ruta de CGContext agregan commands directamente en la ruta actual del context, que se desechan cuando le dice al context que llene o acorte (o abandone explícitamente) la ruta, mientras que un object CGPath los mantiene para que se vuelvan a usar y de nuevo, por ejemplo, si cambia las properties de dibujo de CAShapeLayer.

Por supuesto, hay casos para usar CGPath incluso cuando lo vas a dibujar en un context. Si el set de commands nunca cambia, entonces es una optimization potencial; hace que la transformación del path sea fácil; puedes repetir los commands (por ejemplo, exportarlos a un file) luego. También puede escribir el código de trazado con UIBezierPath (es decir, con los posts Objective-C) y luego pedirle un CGPath.

Usar CGContext en cualquier forma no está mal, y es probable que haya casos en los que sea mejor, pero CAShapeLayer es la manera más fácil para la mayoría de los propósitos, particularmente en Cocoa Touch, donde cada UIView está respaldada por un CALayer al que puedes poner el CAShapeLayer en .