2011-05-20 7 views
5

Salutations! J'essaye de dessiner une série de cercles dans un CALayer qui réside dans un UISCrollView zoomable. C'est la couche qui zoome sur pincement. Si je dessine les cercles à l'aide CAShapeLayer, ils zoom magnifiquement:Dessin anti-aliasé dans un CALayer

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]; 

Cependant, lorsque je tente de les dessiner avec des graphiques de base de vanille dans mon drawLayer: inContext: méthode, les cercles deviennent très Jaggy (carrément pro-crénelage !) Aucun montant de anticrénelage tripotage semble aider:

-(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); 
    } 
} 

J'essaie de comprendre ce que CAShapeLayer fait pour obtenir cette belle anticrénelage de sorte que (en dehors de ma propre gouverne) je peux tirer pleinement parti de graphiques de base dans mon dessin plutôt que juste le coup/remplissage que je peux obtenir avec CAShapeLayer. Est-ce que je manque juste une transformation quelque part?

Merci beaucoup!

Répondre

3

Réponse courte: contentsScale

réponse plus longue: (presque mot pour mot pe8ter à Vector like drawing for zoomable UIScrollView):

Vous pouvez obtenir un meilleur rendu en définissant la propriété contentScale sur la couche en question après le 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]; 
} 

il y a un (généralement excellent) description faite par Brad Larson lorsque le dessin réel se produit (spoiler, il ten- de lly n'apparaît qu'une seule fois malgré le nombre de transformations appliquées) au So a CALayer does not contain a content bitmap of a view?. Sur cette base, je ne peux que supposer que le paramètre contentsScale rend le calque à rendre à nouveau.

0

Je n'ai pas essayé cela, mais si vos cercles deviennent plus tranchants lorsque vous redimensionnez la vue, cela peut être dû à la qualité d'interpolation.

Avez-vous essayé de régler la qualité d'interpolation sur élevée?

CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 
+1

merci pour l'idée, mais pas de chance. CGContextSetInterpolationQuality n'a aucun effet. J'ai également essayé CGContextSetFlatness qui n'a également eu aucun effet. – kalperin