【问题标题】:Why can't you change a UIView background color in drawRect?为什么不能在 drawRect 中更改 UIView 背景颜色?
【发布时间】:2014-07-15 10:28:09
【问题描述】:

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

self.backgroundColor = [UIColor redColor];

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

更改视图的图层背景颜色也没有任何作用,可能是出于同样的原因。视图的backgroundColor和它的layer的backgroundColor有什么关系,因为它们不一样?

【问题讨论】:

  • 不要在drawRect: 中设置视图的属性。那不是他们的地方。

标签: ios ios7 uiview


【解决方案1】:

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

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

所以你仍然可以更改该属性的值,但在再次绘制视图之前不会使用它。

【讨论】:

  • 感谢您指出这一点,我更新了我的答案。有趣的是我从来没有注意到这一点:)
【解决方案2】:

如果您在第一次配置视图时设置backgroundColor(即,操作系统调用drawRect),则backgroundColor 将被使用而无需您编写任何进一步的代码。正如UIView Class Reference 所说,backgroundColor 属性用于“设置视图的颜色,而不是自己绘制该颜色。”

但是如果你尝试在drawRect中设置,背景填充已经进行了,所以你不会立即看到改变背景颜色的效果(除非你在drawRect中手动进行了另一次填充) . drawRect 方法应该用于渲染视图,而不是用于配置它。

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

【讨论】:

  • 谢谢。在调用 drawRect 时是否还有其他视图属性?我不确定配置停止和渲染开始的位置。例如,我可以设置视图的框架或绘制其边框,或者如果有任何文本,则设置文本颜色。所有这些都更好地设置在 init 方法中吗?
  • 您不应该设置视图的任何属性,它的layerdrawRect 中的任何子视图或子层。所以,显然,设置frame 绝对不应该在drawRect 中完成。重新边框,如果您使用layer 的属性来执行此操作,则不属于drawRect,但如果您手动描边/绘制边框,则可以在drawRect 中完成。重新文本颜色,如果您使用标签/文本字段子视图,配置/设置不属于drawRect,但如果您手动抚摸/绘制文本,那么您将在drawRect 中执行此操作.
【解决方案3】:

drawRect 函数上的 swift3 更新:

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

【讨论】:

    【解决方案4】:

    awakeFromNib 函数中设置背景颜色:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      • 2017-12-03
      相关资源
      最近更新 更多