在CALayer中进行抗锯齿绘制

时间:2011-05-20 19:27:57

标签: cocoa-touch ios core-animation

问候!我正在尝试在CALayer中绘制一系列圆圈,这些圆圈位于可缩放的UISCrollView中。这是放大捏的图层。如果我使用CAShapeLayer绘制圆圈,那么它们可以很好地缩放:

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

然而,当我尝试在我的drawLayer:inContext:方法中使用香草核心图形绘制它们时,圆圈变得非常锯齿状(彻头彻尾的专利!)没有任何数量的抗锯齿jiggery-pokery似乎有帮助:

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

我正在试图弄清楚CAShapeLayer正在做什么来获得如此好的抗锯齿效果(除了我自己的启发)我可以充分利用我绘图中的核心图形,而不仅仅是我可以获得的笔触/填充与CAShapeLayer。我只是在某个地方错过了一个变换?

非常感谢!

2 个答案:

答案 0 :(得分:2)

简答:contentsScale

更长的答案:(几乎逐字逐句地从Vector like drawing for zoomable UIScrollView处获取):

通过在缩放后在相关图层上设置contentScale属性,可以获得更好的渲染效果:

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

布拉德拉森(Brad Larson)在So a CALayer does not contain a content bitmap of a view?发生实际绘图(扰流器,通常只发生一次,尽管应用了多少变换)时,有一个(通常很好的)描述。基于此,我只能假设设置contentsScale会导致图层再次渲染。

答案 1 :(得分:0)

我没有试过这个,但是如果你的圈子在调整视图大小时会出现锯齿,那可能是因为插值质量。

您是否尝试过将插值质量设置为高?

    CGContextSetInterpolationQuality(context, kCGInterpolationHigh);