如果 drawRect: 被覆盖,子类化的 UIView 显示黑色背景

Posted

技术标签:

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

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

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

- (void)drawRect:(CGRect)rect

   [super drawRect:rect];


这种行为的原因是什么?

【问题讨论】:

【参考方案1】:

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

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

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

还有:

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

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

【讨论】:

以上是关于如果 drawRect: 被覆盖,子类化的 UIView 显示黑色背景的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 drawRect 覆盖在 UIView 子类的某些区域中获得透明度

当我覆盖“drawRect”时,UIButton 样式设置被忽略

如何在 UIButton 子类中覆盖 -drawrect?

子类化 UIToolbar 并覆盖 drawRect: - UIBarButtonItems 不显示

NSScroller 的子类不绘图

子类化的 SKSpriteNode 触摸事件被忽略