2

在做一个小项目时,我发现自己需要drawRect:在我的一个UIView子类中进行一些自定义绘图。我注意到当我覆盖子类drawRect:的默认背景颜色UIView已从透明更改为黑色时(默认背景颜色是指视图在其backgroundColor属性为 nil 时自行绘制的颜色。)即使是空的drawRect:drawRect:简单的调用[super drawRect:]我也注意到这种行为。

这不是一个真正的问题,因为简单地将 a 设置backgroundColor为非零值就可以,无论是否drawRect:被覆盖。然而,它确实让我开始思考如何UIView知道是否drawRect:被子类覆盖。我知道 Objective-C 提供了确定一个类甚至它的超类是否响应某个选择器的工具。但是超类怎么可能知道它的子类是否覆盖了它的一个方法呢?而且,如果这种内省确实是不可能的,那么在我的例子中会发生什么?

4

1 回答 1

0

这很奇怪(但听起来像是故意的)。只需添加:

- (void) drawRect:...
{
    [super drawRect:...];
}

触发行为?非典型。在任何情况下,使用 Objective-C 运行时 API 来彻底检查类实现细节是微不足道的。请参阅Objective-C 运行时参考。

UIView 的文档-drawRect:详细介绍了子类化。它非常明确地指出,当直接子类化时您不需要调用 super UIView,这表明该类可能已优化为做最少的额外工作(例如绘制在您的实现中完全消失的背景)。

于 2011-02-06T03:28:14.250 回答