如何从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
来绘制,然后将整个图层绘制回到我的UIView
的CGContext
?
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坐标上“戳记”或“绘制”图层。
我希望回答你的问题,如果不是,请让我知道。