提问人:Michael May 提问时间:6/18/2021 更新时间:6/18/2021 访问量:301
它是怎么知道的?当 UIColor 设置填充并且 UIGraphicsImageRendererContext 知道如何填充时
How does it know? When UIColor sets fill and UIGraphicsImageRendererContext knows how to fill
问:
我遇到了一个用于在 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()
UIGraphicsImageRendererContext
CGRect
纯粹从这里的代码来看,我看不到实例方法和实例方法之间的联系。那么,它是怎么知道的呢?集合填充时填充情况如何?UIColor
setFill()
UIGraphicsImageRendererContext
fill(_: CGRect)
UIGraphicsImageRendererContext
UIColor
谢谢。
答:
3赞
matt
6/18/2021
#1
仅从此处的代码来看,我看不到 UIColor 实例方法 setFill() 和 UIGraphicsImageRendererContext 之间的联系
它知道,因为当你说 .setFill()
在代码运行的每一刻,都存在或不存在当前的图形上下文。在运行图形图像呈现器的闭包时,有一个 — 将用于形成图像的图形上下文。这就是关闭的意义。image
image
因此,如果在此闭包中给出,则(隐式)指向当前图形上下文的此命令和类似的 UIColor 和 UIBezierPath 命令将成功。例如,它们还可以成功执行 UIView 重写,因为在此时视图自己的图形上下文是最新的。draw(_:)
但是,尝试在其他时间说,您会看到一条消息,抱怨当前没有图形上下文。setFill()
评论
0赞
Michael May
6/18/2021
谢谢你的解释,@matt。我开始对关闭中发生的事情有一个粗略的了解。我怀疑在方法实现的某个地方,颜色通过一种注册机制以某种方式与特定图形上下文的方法挂钩。因此,当在闭包中调用该方法时,它会检查是否有已注册的颜色等待它用于填充形状。image
setFill()
UIColor.red
fill(_: CGRect)
fill(_: CGRect)
image
1赞
matt
6/18/2021
嗯,不完全是。UIColor 是 CGContext 的一种便捷方法。setFill
setFillColor
评论