为什么不能在drawRect中更改UIView背景颜色?

far*_*adf 20 uiview ios ios7

理论上,您可以通过以下方式轻松设置背景颜色:

self.backgroundColor = [UIColor redColor];
Run Code Online (Sandbox Code Playgroud)

在drawRect中,但这没有任何效果.您可以更改视图的大小,边框,子视图等,但不能更改背景颜色.类似的SO查询建议添加一个subView或更改initWithFrame或initWithCoder初始化消息中的backgroundColor.我的问题是,当其他特征可以改变时,为什么它在drawRect中不起作用?

更改视图的图层backgroundColor也没有做任何事情,也许是出于同样的原因.视图的backgroundColor与其图层的backgroundColor之间有什么关系,因为它们不一样?

Rob*_*Rob 25

如果您backgroundColor在首次配置视图时进行设置(即 OS调用之前drawRect),backgroundColor则无需任何其他代码即可使用该视图.正如UIViewClass Reference所说,该backgroundColor属性用于"设置视图的颜色而不是自己绘制颜色".

但是如果您尝试将其设置为drawRect,则已经执行了背景填充,因此您不会立即看到更改背景颜色的效果(除非您自己手动执行另一次填充drawRect).该drawRect方法应该用于渲染视图,而不是用于配置它.

如果UIView设置backgroundColor正在配置视图(例如,无论init您使用哪种方法),将使用该背景颜色,而无需执行任何其他操作drawRect.


rob*_*ert 7

正如Rob在他的回答中所说,当drawRect调用该方法时已经绘制了背景.如果此时需要更改背景颜色,则必须自己绘制:

[self.backgroundColor setFill];
CGContextFillRect(UIGraphicsGetCurrentContext(), rect);
Run Code Online (Sandbox Code Playgroud)

因此,您仍然可以更改属性的值,但在再次绘制视图之前不会使用它.