我有一个自定义类,我从UIView类派生。我要做的就是画一些垂直的黑线,它们之间有一个预定义的距离。当我重写drawRect方法并编写代码来绘制垂直线时,视图只显示一个完整的黑色背景。然后我注意到,即使是一个空的覆盖drawRect,它只调用超类drawRect的结果在黑色背景。当我注释掉drawRect时,视图就会显示出来,并像我预期的那样变得透明。
这是我在drawRect中使用的唯一代码,它只是调用超类方法:
- (void)drawRect:(CGRect)rect
{
[super drawRect:rect];
}
这种行为的原因是什么?
很可能有一些幕后的诡计正在与UIView,并且基类实际上没有实现drawRect,或者一些偷偷摸摸的优化正在发生。
文档说不调用super如果你是直接覆盖UIView,它也说你不需要实现drawRect如果你所做的是设置背景颜色或你填充内容在其他方式:
这个方法的默认实现不做任何事情。使用原生绘图技术(如Core Graphics和UIKit)绘制视图内容的子类应该覆盖这个方法并在那里实现它们的绘图代码。如果视图以其他方式设置其内容,则不需要重写此方法。例如,如果视图只显示背景颜色,或者视图直接使用底层对象设置其内容,则不需要重写此方法。同样,如果你的视图使用OpenGL ES来绘制,你不应该重写这个方法。
:
如果你直接子类化UIView,你实现这个方法不需要调用super。但是,如果你正在子类化一个不同的视图类,你应该在实现的某个时候调用super。
因此很可能通过调用super你失去了一些东西。你没有显示任何实际的绘图代码所以很难看出你可能在哪里出错,但作为一个起点,如果你直接重写了UIView,不要调用super。