2

我遇到了一个用于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()显然只使指定的颜色,即红色,准备填充某个形状。然而,神奇的是, ctx ,它是 a UIGraphicsImageRendererContext,似乎收到了一条通知,它将CGRect用红色填充形状!

单纯从这里的代码看不出UIColorinstance methodsetFill()UIGraphicsImageRendererContextinstance method之间的联系fill(_: CGRect)。那么,它是怎么知道的呢?集合UIGraphicsImageRendererContext填充时如何填充?UIColor

谢谢你。

4

1 回答 1

2

纯粹从这里的代码,我看不到 UIColor 实例方法 setFill() 和 UIGraphicsImageRendererContext 之间的联系

它知道是因为你说setFill().

在您的代码运行的每一刻,都存在或不存在当前图形上下文。在image图形图像渲染器的闭包运行时,有一个——将用于形成图像的图形上下文。这就是封闭image的意义。

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

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

于 2021-06-18T00:29:16.277 回答