【问题标题】:How draw(_ rect: CGRect) actually work?draw(_ rect: CGRect) 实际如何工作?
【发布时间】:2018-03-28 02:44:21
【问题描述】:

我不明白这个函数实际上是如何工作的 如果我想更改“视图”的背景颜色,我将访问视图的背景属性并更改它的值

let containerView = CustomView(frame: CGRect(x: 0, y: 0, width: 400, height: 400))
containerView.backgroundColor = UIColor.blue

但是当我想在 draw() 函数中改变矩形的颜色时 我只是调用 UIColor.green.set() 函数。为什么这个函数会改变矩形的颜色

class CustomView: UIView {
    override func draw(_ rect: CGRect) {
        super.draw(rect)


        let rect = UIBezierPath(roundedRect: CGRect(x: 150, y: 150, width: 100, height: 100), cornerRadius: 5.0)
        UIColor.green.set()  // <- Why this line change rect color ?
        rect.fill()
    }
}

【问题讨论】:

  • 嗨,@Moritz 抱歉,我正在尝试修复它。
  • 现在好多了。请继续改进它。祝你好运! :)
  • 非常感谢谢谢@Moritz

标签: ios swift cocoa-touch uiview uicolor


【解决方案1】:

UIView 具有 .backgroundColor 属性。当 UIKit 想要显示视图时,它会检查 .backgroundColor 属性并用该颜色“填充”背景。

UIColor.green.set()rect.fill() 不会更改视图的背景颜色。

当你重写draw(_ rect: CGRect) 函数时,UIKit 已经完成了对.backgroundColor 属性的处理,并根据需要填充了背景。 您的代码然后在背景上“绘制一个填充的矩形”。

【讨论】:

  • 谢谢@DonMag 我有一些小问题“UIColor.green.set()”只是一个函数。我不明白为什么这个函数可以改变矩形颜色?
  • 它不会改变矩形颜色...它“设置”fill() 函数要使用的颜色。
  • 哦好的我现在明白了谢谢@DonMag
  • 另外UIColor.set 也不是那么简单。它实际上使用UIGraphicsGetCurrentContext 获取当前上下文,然后在其上设置笔触和填充颜色。 rect.fill 也使用当前上下文。上下文由绘图系统在调用draw 方法之前设置。也许使用context 操作重写代码会很有教育意义。
  • Sulthan 在这里的评论很有用。因为看起来UIColor 的“设置”与矩形的填充方法无关,所以出现了混淆。但是正在发生的事情是,两个幕后都在处理底层的有状态 CoreGraphics 上下文。如果您深入研究 CoreGraphics,您将了解映射。我同意,如果您不熟悉更传统的有状态图形上下文,这是违反直觉的。
猜你喜欢
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多