问候!我试图在驻留在可缩放UISCrollView中的CALayer中绘制一系列圆。这是放大捏的图层。如果我使用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:方法中使用 Vanilla 核心图形绘制它们时,圆圈变得非常锯齿(完全混淆了!)似乎没有多少抗锯齿的拼图游戏可以帮助您:
-(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获得的笔触/填充。我只是在某个地方缺少转换吗?

非常感谢!

最佳答案

简短答案:contentsScale

更长的答案:(从pe8ter在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会导致图层再次渲染。

关于cocoa-touch - CALayer中的抗锯齿图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6076724/

10-13 03:54