【问题标题】:Subclassed UIView shows black background if drawRect: is overridden如果 drawRect: 被覆盖,子类化的 UIView 显示黑色背景
【发布时间】:2012-12-28 18:51:10
【问题描述】:

我有一个从 UIView 类派生的自定义类。我想要完成的只是绘制具有预定义距离的垂直黑线。当我重写 drawRect 方法并编写代码来绘制垂直线时,视图只显示一个完整的黑色背景。然后我注意到,即使是一个只调用超类的 drawRect 的空覆盖 drawRect 也会导致黑色背景。当我注释掉 drawRect 时,视图会显示出来并像我预期的那样变得透明。

这是我在 drawRect 中使用的唯一代码,它只调用超类方法:

- (void)drawRect:(CGRect)rect
{
   [super drawRect:rect];

}

这种行为的原因是什么?

【问题讨论】:

    标签: iphone ios uiview overriding drawrect


    【解决方案1】:

    UIView 很可能存在一些幕后的恶作剧,并且基类实际上并没有实现 drawRect,或者正在发生一些偷偷摸摸的优化。

    文档确实说如果您直接覆盖 UIView,则不要调用 super,它还说如果您所做的只是设置背景颜色或以其他方式填充内容,则不需要实现 drawRect:

    这个方法的默认实现什么都不做。使用本机绘图技术(例如 Core Graphics 和 UIKit)来绘制其视图内容的子类应覆盖此方法并在那里实现其绘图代码。如果您的视图以其他方式设置其内容,则无需重写此方法。例如,如果您的视图仅显示背景颜色,或者您的视图直接使用底层图层对象设置其内容,则不需要覆盖此方法。同样,如果您的视图使用 OpenGL ES 进行绘图,则不应覆盖此方法。

    还有:

    如果你直接继承 UIView,你的这个方法的实现不需要调用 super.但是,如果您要对不同的视图类进行子类化,则应在实现中的某个时刻调用 super。

    因此,调用 super 你很可能会失去一些东西。您没有显示任何实际的绘图代码,因此很难看出您可能在哪里出错,但作为起点,如果您直接覆盖 UIView,请不要调用 super。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多