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

时间:2014-05-26 15:44:57

标签: ios ios7 uiview

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

self.backgroundColor = [UIColor redColor];
在drawRect中

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

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

4 个答案:

答案 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
}