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

问题描述

我在 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(),但是您会看到一条消息,抱怨没有当前图形上下文。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...