理论上,您可以通过以下方式轻松设置背景颜色:
self.backgroundColor = [UIColor redColor];
在drawRect中,但这没有任何效果。您可以更改视图的大小,边框,子视图等,但不能更改背景颜色。类似的SO查询建议添加一个subView或更改initWithFrame或initWithCoder初始化消息中的backgroundColor。我的问题是,当其他特征可以改变时,为什么它不能用于 drawRect ?
更改视图的图层backgroundColor也没有做任何事情,也许是出于同样的原因。视图的backgroundColor与其图层的backgroundColor之间有什么关系,因为它们不一样?
答案 0 :(得分:25)
如果您在首次配置视图时设置backgroundColor
(即,操作系统调用drawRect
之前的),则backgroundColor
将不再使用您的代码。正如UIView
Class Reference所说,backgroundColor
属性用于“设置视图的颜色而不是自己绘制颜色。”
但如果您尝试在drawRect
中设置它,则已经执行了背景填充,因此您不会立即看到更改背景颜色的效果(除非您在{{自己手动执行另一次填充) 1}})。 drawRect
方法应该用于渲染视图,而不是用于配置它。
如果drawRect
在配置视图时设置UIView
(例如,无论您使用哪种backgroundColor
方法),都会使用该背景颜色,而无需执行任何操作init
中的其他任何内容。
答案 1 :(得分:7)
正如Rob在他的回答中所说,当调用drawRect
方法时已经绘制了背景。如果此时需要更改背景颜色,则必须自己绘制:
[self.backgroundColor setFill];
CGContextFillRect(UIGraphicsGetCurrentContext(), rect);
所以你仍然可以改变属性的值,但是在再次绘制视图之前不会使用它。
答案 2 :(得分:1)
drawRect
功能上的swift3更新:
self.backgroundColor = UIColor.red
self.backgroundColor?.setFill()
UIGraphicsGetCurrentContext()!.fill(rect);
答案 3 :(得分:0)
将背景颜色设置为awakeFromNib
功能:
// Objective-C
- (void)awakeFromNib {
self.backgroundColor = [UIColor redColor];
}
// Swift
override func awakeFromNib() {
backgroundColor = UIColor.red
}