我已经阅读了我认为是Quartz 2D Programming Guide的相关部分,但无法找到以下答案(他们似乎没有在文档中谈论过很多关于iOS的内容):
我的应用程序在UIView
中显示图形。我不得不以某种方式更新图纸,例如更改其中一个形状的填充颜色(我将CGPathRefs
保留到重要的形状,以便以后可以使用不同的填充颜色重绘它们)。如上述文档第169页的“使用CGLayer绘图”一节中所述,我正在考虑将整个绘图绘制为CGContext
,我将从CGLayer
中获取,如下所示: / p>
CGContextRef offscreenContext = CGLayerGetContext(offscreenLayer);
然后我可以在屏幕外更新CGContext
并在CGLayer
的drawRect:方法中将UIView
绘制到我的UIView中,如下所示:
CGContextDrawLayerAtPoint(viewContext, CGPointZero, offscreenLayer);
我遇到的问题是,我从哪里获取CGLayer
?我的理解是我必须使用CGLayerCreateWithContext
并使用CGContext
作为参数从中继承它的大部分属性。显然,正确的上下文将是UIView
的上下文,我正在使用
CGContextRef viewContext = UIGraphicsGetCurrentContext();
但是如果我没有弄错的话,我只能在drawRect
:方法中得到它,并且假设下次调用该方法时我给出的上下文将是相同的,这是无效的,即我只能在方法中本地使用CGContext
。
那么,我怎样才能获得CGContext
我可以用来初始化我的CGLayer
来创建一个屏幕外CGContext
来绘制,然后将整个图层绘制回我的{{} 1}} UIView
?
答案 0 :(得分: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);
我发现的一点是,当你在屏幕外画一些东西时,它会在屏幕外自动剪辑。 (有意义,因此它不会绘制未见的东西)但是当你移动图层时(使用矩阵变换)。剪切的路径未显示(缺失)。
最后一件事,如果您将对图层的引用保存到变量中,稍后想要绘制它,则可以使用{/ 1}}方法,如
CGContextDrawLayerAtPoint()
它会在newPointX和新PointY坐标处“压印”或“绘制”图层。
我希望回答你的问题,如果不是,请告诉我。