Dibujo alisado en un CALayer

¡Saludos! Estoy intentando dibujar una serie de círculos en un CALayer que reside en un UISCrollView con zoom. Esta es la capa que aumenta el pellizco. Si dibujo los círculos con CAShapeLayer, entonces hacen un zoom maravillosamente:

CAShapeLayer plotLayer = [CAShapeLayer layer]; plotLayer.bounds = self.bounds; plotLayer.anchorPoint = CGPointZero; plotLayer.position = CGPointZero; CGMutablePathRef path = CGPathCreateMutable(); for (id one in many) { CGRect ellipseRect = [one circleRect]; CGPathAddEllipseInRect(path, NULL, ellipseRect); } plotLayer.path = path CFRelease(path); [self.layer addSublayer:plotLayer]; [plotLayer setNeedsDisplay]; 

Sin embargo, cuando trato de dibujarlos con charts de vainilla en mi drawLayer: inContext: método, los círculos se vuelven muy jaggy (francamente a favor). Ninguna cantidad de antialias jiggery-pokery parece ayudar:

 -(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context { CGContextSetAllowsAntialiasing(context, true); CGContextSetShouldAntialias(context, true); CGContextClip(context); for (id one in many) { CGRect ellipseRect = [one circleRect]; CGContextStrokeEllipseInRect(context, ellipseRect); } } 

Estoy tratando de averiguar qué está haciendo CAShapeLayer para get un antialiasing tan agradable para que (aparte de mi propia edificación) pueda sacar el máximo provecho de los charts centrales en mi dibujo en lugar de solo el golpe / relleno que puedo get con CAShapeLayer. ¿Acabo de fallar una transformación en alguna parte?

¡Muchas gracias!

Respuesta corta: contentsScale

Respuesta más larga: (tomada casi literalmente de pe8ter en Vector como dibujo para UIScrollView en zoomable ):

Puede get una mejor representación estableciendo la propiedad contentScale en la capa en cuestión después de hacer zoom:

 - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale { [CATransaction begin]; [CATransaction setValue:[NSNumber numberWithBool:YES] forKey:kCATransactionDisableActions]; uglyBlurryTextLayer.contentsScale = scale; [CATransaction commit]; } 

Hay una descripción (por lo general excelente) de Brad Larson de cuando ocurre el dibujo real (spoiler, por lo general solo ocurre una vez a pesar de cuántas transformaciones se aplican) ¿Entonces un CALayer no contiene un bitmap de contenido de una vista? . Basado en esto, solo puedo suponer que la configuration de contenidos Scale hace que la capa se vuelva a representar.

No he intentado esto, pero si tus círculos se vuelven borrosos al cambiar el tamaño de la vista, es posible que se deba a la calidad de la interpolación.

¿Ha intentado establecer la calidad de interpolación en alta?

  CGContextSetInterpolationQuality(context, kCGInterpolationHigh);