我已经阅读了我认为是《 Quartz 2D编程指南》的相关部分的内容,但是找不到以下内容的答案(它们在文档中似乎不太谈论iOS):
我的应用程序显示一个UIView
的图形。我时不时要以某种方式更新绘图,例如更改其中一种形状的填充颜色(我将CGPathRefs
保留为重要形状,以便以后可以使用其他填充颜色重绘它们)。如上述文档的第169页的“使用CGLayer绘图”一节中所述,我正在考虑将整个绘图绘制成可从CGContext
获得的CGLayer
,如下所示:
CGContextRef offscreenContext = CGLayerGetContext(offscreenLayer);
然后,我可以在屏幕外将其更新为
CGContext
并将CGLayer
绘制到UIView
的drawRect:方法中的UIView中,如下所示:CGContextDrawLayerAtPoint(viewContext, CGPointZero, offscreenLayer);
我遇到的问题是,我从哪里获得
CGLayer
?我的理解是,我必须使用CGLayerCreateWithContext
进行设置,并提供CGContext
作为参数,并从中继承大部分属性。显然,正确的上下文是我所获得的UIView
的上下文CGContextRef viewContext = UIGraphicsGetCurrentContext();
但是,如果我没记错的话,我只能在
drawRect
:方法中得到它,并且假设下一次调用该方法的上下文是无效的,即我只能使用那个CGContext
在方法内本地。因此,如何获得可用来初始化
CGContext
的CGLayer
,以创建要绘制到屏幕外的CGContext
,然后将整个图层重新绘制到UIView
的CGContext
中?PS:当你在的时候;如果上述内容没有任何意义或不合理,请告诉我。我才刚开始了解Quartz 2D。
最佳答案
首先,如果您是在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);
我发现的一点是,当您在屏幕外绘制某物时,它会自动将其裁剪到屏幕外。 (很有意义,因此它不会绘制看不见的东西),但是当您移动图层时(使用矩阵变换)。剪切的路径未显示(丢失)。
最后一件事,如果将对图层的引用保存到变量中,然后再绘制它,则可以使用
CGContextDrawLayerAtPoint()
方法,例如CGContextDrawLayerAtPoint(ctx, (CGPoint) {newPointX, newPointY}, layer);
它将在该newPointX和新PointY坐标处“标记”或“绘制”该层。
我希望能回答您的问题,如果没有,请告诉我。