我有一个自定义类,我从UIView类派生。我想要完成的只是绘制具有预定距离的垂直黑线。当我覆盖drawRect方法并编写我的代码来绘制垂直线时,视图只显示一个完整的黑色背景。然后我注意到即使是一个空的重写的drawRect,只调用超类'drawRect会产生黑色背景。当我注释掉drawRect时,视图会显示出来,并按照我的预期变得透明。
这是我在drawRect中使用的唯一代码,它只调用超类方法:
- (void)drawRect:(CGRect)rect
{
[super drawRect:rect];
}
这种行为可能是什么原因?
答案 0 :(得分:3)
很可能是UIView上有一些引擎盖下的恶作剧,并且基类实际上没有实现drawRect,或者正在进行一些偷偷摸摸的优化。
如果您直接覆盖UIView,文档会说不要调用super,并且它还表示如果您只是设置背景颜色或者以其他方式填充内容,则不需要实现drawRect:
此方法的默认实现不执行任何操作。使用本机绘图技术(如Core Graphics和UIKit)绘制视图内容的子类应重写此方法并在其中实现其绘图代码。如果视图以其他方式设置其内容,则无需覆盖此方法。例如,如果视图仅显示背景颜色,或者视图使用基础图层对象直接设置其内容,则无需覆盖此方法。同样,如果视图使用OpenGL ES进行绘制,则不应覆盖此方法。
和
如果直接子类化UIView,则此方法的实现不需要调用super。但是,如果要为不同的视图类创建子类,则应在实现中的某个时刻调用super。
因此,通过召唤超级你很可能会失去一些东西。你没有显示任何实际的绘图代码,因此很难看出你可能出错的地方,但作为一个起点,如果你直接覆盖UIView,不要调用super。