1

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

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

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

}

这种行为的原因是什么?

4

1 回答 1

3

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

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

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

和:

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

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

于 2012-12-28T19:13:07.147 回答