为什么不能在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 }