在iOS上,在我们从上下文创建图层并获取图层的上下文之后,这些上下文如何相互关联?

时间:2012-05-20 10:34:15

标签: ios core-graphics calayer quartz-2d graphicscontext

我们可以从当前图形上下文创建一个图层,然后获取图层的上下文:

CGContextRef context = UIGraphicsGetCurrentContext();

CGLayerRef layer = CGLayerCreateWithContext(context, 
                                            CGSizeMake(self.frame.size.width,
                                                self.frame.size.height), NULL);

CGContextRef contextOfLayer = CGLayerGetContext(layer);

所以我们现在有2个上下文:contextcontextOfLayer。这两种情境如何相互关联? contextOfLayer实际上是context的一部分而context是否有一组图层上下文指针?如果我使用NSLog(@"%p", ...)打印出地址,则它们具有不同的地址,因此它们不是同一个对象。我认为contextOfLayer不会影响上下文堆栈,因此它只是一种独立的上下文,只是存在于那里"本身?

1 个答案:

答案 0 :(得分:3)

如果您了解CGLayer的基本原理,这会有所帮助。当您将相同内容重复绘制到特定类型的上下文中时,CGLayer意味着优化。

(例如:具有特定格式的位图上下文 - 例如32位RGBA - 或PDF上下文等)

创建CGLayer时,会将您想要绘制CGLayer的上下文传递给它。这使得CGLayer可以针对这种情境优化自身。

稍后,如果绘制的CGLayer到这方面,或者到具有相同的格式不同的情况下,该图将会更快。

如果您将CGLayer绘制到具有不同格式的上下文中,则绘图仍然有效,并且您不会收到错误。但是,它可能不会比你刚刚直接进入上下文时更快。

documentation for CGLayerCreateWithContext说:

  

context

     

要创建相对于图层的图形上下文。   该图层使用此图形上下文作为参考   初始化。

这意味着图层会将给定的context视为参考。它并不一定意味着context存储在CGLayer中,或永久引用。它可能是,但你不能说 - 这是一个内部实现细节。

documentation for CGLayerGetContext

  

返回的上下文是图层本身的上下文,而不是您在创建图层时指定的上下文。

所以你应该期待context != contextOfLayer

同样,API没有详细说明这些上下文如何相互关联 - 它们可能在内部相互引用,也可能不引用。作为API的用户,我们不应该做任何事情。

具体回答您的问题:

  

contextOfLayer实际上是上下文的一部分,上下文是否有一个层上下文指针数组?

我们不知道,也无法找到答案。作为API的用户,我们不应该编写任何采用这种或那种方式的代码。

  

我觉得contextOfLayer不影响上下文堆栈,所以它只是一个独立的情况下只是一种本身“存在在那里?”

是的,这是一个独立的背景。 UIKit中的“上下文堆栈”是一个更高级别的概念。 CoreGraphics中的CGLayer是一个较低级别的API,对UIKit一无所知。