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

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

提问人:Michael May 提问时间:6/18/2021 更新时间:6/18/2021 访问量:301

问:

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

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))
}

在上面的代码中,显然只使指定的颜色(即红色)准备好填充某个形状。然而,神奇的是,ctx,一个 ,似乎收到了一个通知,它将用红色填充形状!UIColor.red.setFill()UIGraphicsImageRendererContextCGRect

纯粹从这里的代码来看,我看不到实例方法和实例方法之间的联系。那么,它是怎么知道的呢?集合填充时填充情况如何?UIColorsetFill()UIGraphicsImageRendererContextfill(_: CGRect)UIGraphicsImageRendererContextUIColor

谢谢。

iOS UICroark CGCureation UIGonageContext UIGonageImageRenderer

评论


答:

3赞 matt 6/18/2021 #1

仅从此处的代码来看,我看不到 UIColor 实例方法 setFill() 和 UIGraphicsImageRendererContext 之间的联系

它知道,因为当你说 .setFill()

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

因此,如果在此闭包中给出,则(隐式)指向当前图形上下文的此命令和类似的 UIColor 和 UIBezierPath 命令将成功。例如,它们还可以成功执行 UIView 重写,因为在此时视图自己的图形上下文是最新的。draw(_:)

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

评论

0赞 Michael May 6/18/2021
谢谢你的解释,@matt。我开始对关闭中发生的事情有一个粗略的了解。我怀疑在方法实现的某个地方,颜色通过一种注册机制以某种方式与特定图形上下文的方法挂钩。因此,当在闭包中调用该方法时,它会检查是否有已注册的颜色等待它用于填充形状。imagesetFill()UIColor.redfill(_: CGRect)fill(_: CGRect)image
1赞 matt 6/18/2021
嗯,不完全是。UIColor 是 CGContext 的一种便捷方法。setFillsetFillColor