如何从UIView创build一个CGLayer进行离屏绘制

我已经阅读了我认为是“Quartz 2D编程指南”的相关部分,但是找不到下面的答案(他们似乎没有在文档中谈论很多关于iOS的内容):

我的应用程序在UIView显示一个graphics。 每隔一段时间,我都必须以某种方式更新graphics,例如更改其中一个形状的填充颜色(我将CGPathRefs保留为重要形状,以便稍后用不同的填充颜色重新绘制它们)。 正如上述文档第169页上的“用CGLayer绘图”一节所描述的那样,我正在考虑将整个graphics绘制成一个CGContext ,我将从CGLayer获取这个CGContext ,如下所示:

 CGContextRef offscreenContext = CGLayerGetContext(offscreenLayer); 

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

 CGContextDrawLayerAtPoint(viewContext, CGPointZero, offscreenLayer); 

我遇到的问题是,我从哪里得到我的CGLayer ? 我的理解是我必须使用CGLayerCreateWithContext并提供CGContext作为参数,从中inheritance它的大部分属性。 显然,正确的背景将是UIView的背景,我正在相处

 CGContextRef viewContext = UIGraphicsGetCurrentContext(); 

但是如果我没有弄错,我只能在drawRect :方法中得到它,并且假设下一次调用该方法的上下文将是相同的,也就是说我只能使用该CGContext在本地方法。

那么,我怎样才能得到一个CGContext ,我可以用它初始化我的CGLayer来创build一个离屏的CGContext来绘制,然后将整个图层绘制回到我的UIViewCGContext

PS:当你在这里; 如果上面的东西没有意义或不理智,请让我知道。 我刚刚开始钻研Quartz 2D。

首先,如果你是在iOS环境下做的,我认为你是对的。 文档清楚地表明,获取CGContextRef的唯一方法是通过

 CGContextRef ctx = UIGraphicGetCurrentContext(); 

然后你使用该上下文来创buildCGLayer

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

如果你想在该图层上绘制,你必须用从图层中获得的上下文来绘制它。 (它与您之前创buildCGLayer的上下文有所不同)。 我猜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); 

我发现的一点是,当你在屏幕外画东西的时候,它会自动把屏幕上的东西剪掉。 (有道理,所以它不绘制没有看到的东西),但是当你移动图层(使用matrix转换)。 截断的path不显示(丢失)。

最后一件事情是,如果将对图层的引用保存到variables中,并且稍后想要绘制它,则可以使用像CGContextDrawLayerAtPoint()方法

 CGContextDrawLayerAtPoint(ctx, (CGPoint) {newPointX, newPointY}, layer); 

它会在该newPointX和新的PointY坐标上“戳记”或“绘制”图层。

我希望回答你的问题,如果不是,请让我知道。