如何从UIView创建一个CGLayer用于离屏绘图

时间:2011-02-11 00:57:28

标签: iphone ipad ios quartz-2d

我已经阅读了我认为是Quartz 2D Programming Guide的相关部分,但无法找到以下答案(他们似乎没有在文档中谈论过很多关于iOS的内容):

我的应用程序在UIView中显示图形。我不得不以某种方式更新图纸,例如更改其中一个形状的填充颜色(我将CGPathRefs保留到重要的形状,以便以后可以使用不同的填充颜色重绘它们)。如上述文档第169页的“使用CGLayer绘图”一节中所述,我正在考虑将整个绘图绘制为CGContext,我将从CGLayer中获取,如下所示: / p>

CGContextRef offscreenContext = CGLayerGetContext(offscreenLayer);

然后我可以在屏幕外更新CGContext并在CGLayer的drawRect:方法中将UIView绘制到我的UIView中,如下所示:

CGContextDrawLayerAtPoint(viewContext, CGPointZero, offscreenLayer);

我遇到的问题是,我从哪里获取CGLayer?我的理解是我必须使用CGLayerCreateWithContext并使用CGContext作为参数从中继承它的大部分属性。显然,正确的上下文将是UIView的上下文,我正在使用

CGContextRef viewContext = UIGraphicsGetCurrentContext();

但是如果我没有弄错的话,我只能在drawRect:方法中得到它,并且假设下次调用该方法时我给出的上下文将是相同的,这是无效的,即我只能在方法中本地使用CGContext

那么,我怎样才能获得CGContext我可以用来初始化我的CGLayer来创建一个屏幕外CGContext来绘制,然后将整个图层绘制回我的{{} 1}} UIView

PS:你在做的时候;如果上面的任何内容没有意义或没有理智,请告诉我。我刚刚开始了解Quartz 2D。

1 个答案:

答案 0 :(得分:1)

首先,如果您是在iOS环境中进行此操作,我认为您是对的。文档清楚地说,获得CGContextRef的唯一方法是

CGContextRef ctx = UIGraphicGetCurrentContext();

然后使用该上下文创建CGLayer

CGLayerRef layer = CGLayerCreateWithContext(ctx, (CGSize){0,0}, NULL);

如果要在该图层上绘图,则必须使用从图层获得的上下文绘制它。 (它与您之前传递的用于创建CGLayer的上下文有些不同)。我猜测CGLayerCreateWithContext会保存从传入的上下文中获取的信息,但不能保存所有信息。 (其中一个示例是ColorSpace信息,您必须在使用CGLayer的上下文填充内容时重新指定。

您可以从CGLayerGetContext()函数获取CGLayer上下文参考,并使用它来绘制。

CGContextRef layerCtx = CGLayerGetContext(layer);
CGContextBeginPath(layerCtx);
CGContextMoveToPoint(layerCtx, -10, 10);
CGContextAddLineToPoint(layerCtx, 100, 10);
CGContextAddLineToPoint(layerCtx, 100, 100);
CGContextClosePath(layerCtx);

我发现的一点是,当你在屏幕外画一些东西时,它会在屏幕外自动剪辑。 (有意义,因此它不会绘制未见的东西)但是当你移动图层时(使用矩阵变换)。剪切的路径未显示(缺失)。

最后一件事,如果您将对图层的引用保存到变量中,稍后想要绘制它,则可以使用{/ 1}}方法,如

CGContextDrawLayerAtPoint()

它会在newPointX和新PointY坐标处“压印”或“绘制”图层。

我希望回答你的问题,如果不是,请告诉我。