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

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

self.backgroundColor = [UIColor redColor]; 

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

更改视图的图层backgroundColor也没有什么,也许出于同样的原因。 视图的backgroundColor和它的图层的backgroundColor之间有什么关系,因为它们不一样?

如果在视图第一次configuration时(即, OS调用drawRect 之前 )设置了backgroundColor ,那么将使用backgroundColor而不需要您进一步的代码。 正如UIView类引用所说的, backgroundColor属性用于“设置视图的颜色,而不是自己绘制颜色”。

但是如果你尝试在drawRect设置它,背景填充已经被执行了,所以你不会立即看到改变背景颜色的效果(除非你自己在drawRect手动执行另一个填充)。 应该使用drawRect方法来渲染视图,而不是configuration它。

如果UIView在configuration视图的时候设置了backgroundColor (例如在你使用的init方法中),那么将使用该背景颜色,而不需要在drawRect做任何其他的事情。

正如Rob在他的回答中所说的,当drawRect方法被调用时,背景已经被绘制了。 如果你现在需要改变背景颜色,你将不得不自己绘制:

 [self.backgroundColor setFill]; CGContextFillRect(UIGraphicsGetCurrentContext(), rect); 

所以你仍然可以改变属性的值,但是直到再次绘制视图才会使用它。

drawRect函数上更新swift3:

  self.backgroundColor = UIColor.red self.backgroundColor?.setFill() UIGraphicsGetCurrentContext()!.fill(rect); 

设置你的背景颜色到你的awakeFromNib函数中:

 // Objective-C - (void)awakeFromNib { self.backgroundColor = [UIColor redColor]; } // Swift override func awakeFromNib() { backgroundColor = UIColor.red }