问题描述
我在 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))
}
在上面的代码中,UIColor.red.setFill()
显然只是让指定的颜色,即红色,准备填充某个形状。然而,神奇的是,作为 UIGraphicsImageRendererContext
的 ctx 似乎收到了一个通知,它将用红色填充 CGRect
形状!
仅从这里的代码来看,我看不到 UIColor
实例方法 setFill()
和 UIGraphicsImageRendererContext
实例方法 fill(_: CGRect)
之间的联系。那么,它是怎么知道的呢? UIGraphicsImageRendererContext
设置填充时 UIColor
如何填充?
谢谢。
解决方法
纯粹从这里的代码看,我看不到 UIColor 实例方法 setFill() 和 UIGraphicsImageRendererContext 之间的联系
它知道,因为当您说 setFill()
时,您处于图形上下文中。
在您的代码运行的每一刻,都有或没有当前图形上下文。在图形图像渲染器的 image
闭包运行时,有一个 - 将用于形成图像的图形上下文。这就是处于 image
闭包中的含义。
因此,如果在此闭包中给出,则此和类似的 UIColor 和 UIBezierPath 命令(隐式)指向当前图形上下文将成功。他们也会成功,比如 UIView draw(_:)
覆盖,因为此时视图自己的图形上下文是当前的。
尝试在其他时间说setFill()
,但是您会看到一条消息,抱怨没有当前图形上下文。