为什么UIView有自己的CGContext,而CALayer没有?

Why does UIView has its own CGContext, but CALayer does not?

我正试图通过 swift 做一些复杂的绘图。我想要做的是首先在 CALayer 上绘制 CGPath,然后将 CALayer 添加到底部视图。 (因为我需要在CALayer和不同的CALayer之间使用不同的混合模式)但是,我发现CALayer的绘制功能和UIView的绘制功能有显着差异

//UIView's draw function
func draw(_ rect: CGRect)
//CALayer's draw function
func draw(in ctx: CGContext)

我注意到我必须给CALayer一个CGContext,这是否意味着CALayer不能绘制自己? UIView的绘制和CALayer的绘制有什么区别?

您没有为图层提供上下文。它已经有了上下文;当它调用 draw(in:) 时,它只是向您提供对该上下文的引用,以便您可以明确地在其中绘制。这实际上比视图更好,因为对于视图,您必须通过调用 UIGraphicsGetCurrentContext 来获取对上下文的引用。

不过,如果图层属于视图,通常不需要使用图层的绘制方法 — 因为您已经获得了视图绘制方法。通常仅当图层 不是 视图的底层时才需要图层绘制方法。

请注意,您永远不会调用这些方法中的任何一个!他们被要求为你服务。您要做的是 实施 它们,以便在调用它们时,您就在那里,准备好说出应该将什么绘图放入视图/层。