我们可以从当前图形上下文创建一个图层,然后拿到层的情况下:
CGContextRef context = UIGraphicsGetCurrentContext();
CGLayerRef layer = CGLayerCreateWithContext(context,
CGSizeMake(self.frame.size.width,
self.frame.size.height), NULL);
CGContextRef contextOfLayer = CGLayerGetContext(layer);
所以我们现在有2个背景: context
和contextOfLayer
。 如何这两个环境之间的相互关系? 是contextOfLayer
实际的一部分context
和context
已层上下文指针的数组? 如果我用打印出他们的地址NSLog(@"%p", ...)
它们有不同的地址,所以它们不是同一个对象。 我认为contextOfLayer
不影响上下文堆栈,所以它只是一种刚刚独立的上下文中,“存在在那里”本身?
它可以帮助你理解的理由CGLayer
。 CGLayer
当你反复绘制同一内容到特定类型的上下文是指作为优化。
(例如:位图上下文与特定格式 - 例如,32位的RGBA - 或PDF上下文等)
当您创建CGLayer
,你通过它,你打算牵动背景CGLayer
成。 这让CGLayer
优化本身那种情境。
后来,如果你画CGLayer
到这方面,或者到具有相同的格式不同的情况下,绘图会更快。
如果你画一个CGLayer
与不同格式的情况下,绘图仍然会工作,你不会得到一个错误。 但是,它可能没有任何速度比它本来如果你刚刚直接卷入这方面。
该用于CGLayerCreateWithContext文件说:
上下文
该图形上下文要创建相对于层。 该层使用该图形上下文作为用于初始化的参考。
这意味着该层看起来在给定的context
作为参考。 这并不一定意味着context
存储在内部CGLayer
,或永久引用。 这可能是,但你不能告诉 - 它是一个内部实现细节。
该用于CGLayerGetContext文档说
所返回的上下文是该层本身,而不是您在创建图层指定的上下文背景。
所以,你应该想到的是context != contextOfLayer
。
同样,API不指定有关这些上下文如何彼此相关的任何事情 - 他们可能相互引用内部,也可能不是。 作为API的用户,我们不应该假设任何事情。
具体回答你的问题:
是contextOfLayer实际语境和上下文的一部分已经层上下文指针的数组?
我们不知道,我们不能找出来。 作为API的用户,我们不应该编写假定这样或那样的任何代码。
我认为contextOfLayer不影响上下文堆栈,所以它只是一种刚刚独立的上下文中,“存在在那里”本身?
是的,它是一个独立的环境。 UIKit中的“上下文栈”是一个更高层次的概念。 CGLayer
CoreGraphics在一个低级别的API,它不知道任何有关UIKit
。
文章来源: On iOS, after we create a layer from context and get the layer's context, how do these contexts relate to each other?