在处理一个小项目时,我发现自己需要在drawRect:
个子类中通过UIView
进行自定义绘图。我注意到当我覆盖drawRect:
时,UIView
子类的默认背景颜色已从透明变为黑色(默认情况下,背景颜色是指视图在其backgroundColor
属性时绘制的颜色是零。)即使只是调用drawRect:
的空drawRect:
或[super drawRect:]
,我也注意到了这种行为。
这不是一个真正的问题,因为简单地将backgroundColor
设置为非零值无论是否覆盖drawRect:
都有效。但是,它确实让我开始思考UIView
如何知道drawRect:
是否被子类覆盖。我知道Objective-C提供了一些工具来确定一个类甚至它的超类是否响应某个选择器。但是超类怎么可能知道它的子类是否覆盖了它的一个方法呢?而且,如果这种内省确实不可能,我的例子中可能会发生什么?
答案 0 :(得分:0)
这很奇怪(但听起来像是有意的)。只需添加:
- (void) drawRect:...
{
[super drawRect:...];
}
触发行为?非典型。无论如何,使用Objective-C运行时API来彻底地内省类实现细节是微不足道的。请参阅Objective-C runtime reference.
UIView's documentation for -drawRect:
详细介绍了子类化。它非常明确地说明在直接子类化UIView
时你不需要调用super,这表明该类可能已经过优化以完成最少量的额外工作(比如绘制一个完全在你的实现中被删除的背景)