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

5
我已经阅读了Quartz 2D编程指南的相关部分,但是在文档中似乎没有涉及iOS的内容,无法找到下面问题的答案:
我的应用程序在一个UIView中显示绘图。不时需要以某种方式更新绘图,例如更改一个形状的填充颜色(我保留了CGPathRefs以便稍后使用不同的填充颜色重新绘制它们)。如上述文档第169页的“使用CGLayer进行绘图”一节所述,我考虑将整个绘图绘制到从CGLayer获取的CGContext中,方法如下:
CGContextRef offscreenContext = CGLayerGetContext(offscreenLayer);

接下来我可以在屏幕外面对CGContext进行更新,并在UIViewdrawRect:方法中将CGLayer绘制到我的UIView中,如下所示:

CGContextDrawLayerAtPoint(viewContext, CGPointZero, offscreenLayer);

我的问题是,我应该从哪里获取我的CGLayer呢? 我的理解是,我必须使用CGLayerCreateWithContext 创建它,并提供一个CGContext 作为参数,以便它继承大部分属性。显然,正确的上下文应该是我正在获取的UIView 的上下文。
CGContextRef viewContext = UIGraphicsGetCurrentContext();

但如果我没记错的话,我只能在drawRect方法中获得它,并且不能假设我得到的上下文将在下一次调用该方法时是相同的,也就是说,我只能在该方法中本地使用那个CGContext

那么,我怎样才能获得一个CGContext,以便用它来初始化我的CGLayer,创建一个离屏的CGContext进行绘制,然后将整个图层绘制回我的UIViewCGContext中呢?

附言:如果上面的任何内容不合理或不明智,请告诉我。我刚开始了解Quartz 2D。

1个回答

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);

我发现的一个要点是,当你在屏幕外绘制东西时,它自动裁剪掉屏幕外的东西(很有道理,这样就不会绘制看不到的东西)。但是当你移动图层(使用矩阵变换)时,被裁剪的路径不会显示(丢失)。
最后一个要注意的是,如果你将一个图层的引用保存到一个变量中,并且稍后想要绘制它,你可以使用 CGContextDrawLayerAtPoint() 方法。
CGContextDrawLayerAtPoint(ctx, (CGPoint) {newPointX, newPointY}, layer);

它将在新的newPointX和newPointY坐标处“盖章”或“绘制”该图层。

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


我也遇到了CGLayer的问题,我不明白如何在我的touchedmoved函数中写入它,请您看一下我的帖子http://stackoverflow.com/questions/11341763/how-to-use-cglayer-for-optimal-drawing。 - Ranjit
CGContextBeginPath() 和 CGContextClosePath() 接受一个上下文参数。 - Ant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接