我已经阅读了我认为是《 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在方法内本地。

因此,如何获得可用来初始化CGContextCGLayer,以创建要绘制到屏幕外的CGContext,然后将整个图层重新绘制到UIViewCGContext中?

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坐标处“标记”或“绘制”该层。

我希望能回答您的问题,如果没有,请告诉我。

10-08 07:46