它怎么知道的?当 UIColor 设置填充并且 UIGraphicsImageRendererContext 知道如何填充时

How does it know? When UIColor sets fill and UIGraphicsImageRendererContext knows how to fill

我遇到了一个使用 UIGraphicsImageRender 在 Medium 上吸引导师的例子。示例代码如下:

let renderer = UIGraphicsImageRenderer(size: CGSize(width: 20, height: 20))
let img = renderer.image { (ctx) in
    let size = renderer.format.bounds.size
    UIColor.red.setFill()
    ctx.fill(CGRect(x: 0, y: 0, width: size.width, height: size.height))
}

在上面的代码中,UIColor.red.setFill() 显然只使指定的颜色,即红色,准备好填充特定的形状。然而,神奇的是,作为 UIGraphicsImageRendererContext 的 ctx 似乎已经收到通知,它将用红色填充 CGRect 形状!

纯粹从这里的代码来看,我看不出UIColor实例方法setFill()UIGraphicsImageRendererContext实例方法fill(_: CGRect)之间的联系。那么,它是怎么知道的呢? UIColor设置填充时UIGraphicsImageRendererContext如何填充?

谢谢。

Purely from the code here, I cannot see the connection between the UIColor instance method setFill() and the UIGraphicsImageRendererContext

它知道,因为当您说 setFill() 时,您 图形上下文中。

在您的代码处于 运行 的任何时刻,存在或不存在 当前图形上下文 。在图形图像渲染器的 image 闭包运行时,有一个 - 将用于形成图像的图形上下文。这就是image闭包中的意思。

因此,如果在此闭包中给出此命令和类似的(隐式)针对当前图形上下文的 UIColor 和 UIBezierPath 命令,将会成功。他们也会成功,比如说,一个 UIView draw(_:) 覆盖,因为在那一刻视图自己的图形上下文是当前的。

试着在 其他 的时候说 setFill(),但是,您会看到一条消息抱怨 没有 当前图形上下文。