如果 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 样式设置被忽略