Ios draw(rect:CGRect)实际上是如何工作的?

Ios draw(rect:CGRect)实际上是如何工作的?,ios,swift,cocoa-touch,uiview,uicolor,Ios,Swift,Cocoa Touch,Uiview,Uicolor,我不明白这个函数实际上是如何工作的 若我想更改“视图”的背景色,我将转到视图的acces背景属性并更改其值 let containerView = CustomView(frame: CGRect(x: 0, y: 0, width: 400, height: 400)) containerView.backgroundColor = UIColor.blue 但当我想在draw()函数中更改矩形的颜色时 我只是调用UIColor.green.set()函数。为什么此函数会更改矩形的颜色 cl

我不明白这个函数实际上是如何工作的 若我想更改“视图”的背景色,我将转到视图的acces背景属性并更改其值

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()
    }
}
类自定义视图:UIView{
重写函数绘图(rect:CGRect){
超级绘图(矩形)
设rect=UIBezierPath(roundedRect:CGRect(x:150,y:150,宽度:100,高度:100),拐角半径:5.0)

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

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


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

嗨,@Moritz抱歉我正在尝试修复它。现在好多了。请继续改进它。祝你好运!:)我很感谢@MoritzThanke@DonMag我有个小问题“UIColor.green.set()”只是一个函数。我不明白为什么这个函数可以更改矩形颜色?它不会更改矩形颜色…它“设置”
fill()要使用的颜色
function.oh好的,我现在明白了,谢谢@donmagal
UIColor.set
并不是那么简单。它实际上使用
UIGraphicsGetCurrentContext
获取当前上下文,然后设置笔划和填充颜色。
rect.fill
也使用当前上下文。上下文由绘图系统在之前设置调用de>draw
方法。使用
上下文
操作重写代码可能会有教育意义。Sulthan在这里的评论很有用。由于它看起来像
UIColor
的“集合”,所以会产生混淆与rect的fill方法无关。但实际情况是,两个幕后都在处理底层有状态的CoreGraphics上下文。如果你深入研究CoreGraphics,你就会理解映射。我同意,如果你不熟悉更传统的有状态图形上下文,这是违反直觉的。