【问题标题】:How does it know? When UIColor sets fill and UIGraphicsImageRendererContext knows how to fill它是怎么知道的?当 UIColor 设置填充并且 UIGraphicsImageRendererContext 知道如何填充
【发布时间】:2021-09-02 18:02:50
【问题描述】:

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

单纯从这里的代码看不出UIColor实例方法setFill()UIGraphicsImageRendererContext实例方法fill(_: CGRect)之间的联系。那么,它是怎么知道的呢? UIColor设置填充时UIGraphicsImageRendererContext如何填充?

谢谢。

【问题讨论】:

    标签: ios uicolor cgcontext uigraphicscontext uigraphicsimagerenderer


    【解决方案1】:

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

    当你说setFill() 时,它知道,因为你在图形上下文中。

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

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

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

    【讨论】:

    • 感谢您的解释,@matt。我开始大致了解image 闭包中发生的事情。我怀疑在实现setFill() 方法的某个地方,UIColor.red 颜色通过某种注册机制以某种方式连接到某个图形上下文的fill(_: CGRect) 方法。因此,当在 image 闭包中调用 fill(_: CGRect) 方法时,它会检查是否有注册的颜色在等待它用于填充形状。
    • 嗯,不完全是。 UIColor setFill 是 CGContext setFillColor 的便捷方法。
    猜你喜欢
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多