透明度和CGLayers

时间:2012-06-07 18:01:06

标签: ios ios5 core-graphics

我正在为我的iOS5应用创建一些CGLayer,如下所示:

layer_1 = CGLayerCreateWithContext (context,self.bounds.size, NULL);    
offlineContext_1 = CGLayerGetContext (layer_1);
layer_2 = CGLayerCreateWithContext (context,self.bounds.size, NULL);    
offlineContext_2 = CGLayerGetContext (layer_2);
layer_3 = CGLayerCreateWithContext (context,self.bounds.size, NULL);    
offlineContext_3 = CGLayerGetContext (layer_3);

对于计时器的每一步,我都会绘制到offline_contexts,当所有绘图完成后,我会通过调用将所有图层收集到一起:

CGContextDrawLayerAtPoint (context, CGPointZero, layer_1);
CGContextDrawLayerAtPoint (context, CGPointZero, layer_2);
CGContextDrawLayerAtPoint (context, CGPointZero, layer_3);

这很有效。层1的内容看起来被层2的内容过度拉伸,然后层3覆盖前两层。所有绘图都使用如下调用完成:

    CGContextAddArc(context,cx,cy,radius,-fromDir,toDir,1-curve);

出于性能原因,我用图像替换了很多像上面这样的重复绘图命令,这样结果应该是相同的,但不是绘制CGContextAddArc()20次,而是告诉图像绘制自己20次:

[myArcImage drawAtPoint: loc];

然而,随着这一改变,叠加的顺序似乎已经改变。最终会将图像绘制到集合视图中,但只有图像中那些不覆盖其他线条和弧线的部分才会被绘制到其他上下文中。我曾经在drawAtPoint变体中使用混合,但这只会影响图像中可见的部分。

关于为什么直线和圆弧覆盖其他图层中的内容但是图像没有的任何想法?

非常感谢

1 个答案:

答案 0 :(得分:1)

好吧,我突然意识到自己在做什么。我绘制的弧线和线条类似于上面的CGContextAddArc()调用,该调用将参数作为绘制的上下文。当我切换到绘制图像时,drawAtPoint()方法不会将上下文作为参数。相反,它将图像绘制到当前上下文,在我的情况下是当前UIView的上下文。

我的问题的解决方案是使用push / pop上下文调用来包装drawAtPoint调用:

UIGraphicsPushContext(correct_context);
[myArcImage drawAtPoint: loc];
UIGraphicsPopContext();