1

注意:我不寻求解决实际问题。我好奇地问。

我有一个UIView在应用程序主视图中使用的自定义子类。它有一个金属层类:

+ (id)layerClass
{
    return [CAMetalLayer class];
}

我注意到,如果我覆盖-(void)drawRect:(CGRect)rect方法,则会开始出现一条错误消息:

<CAMetalLayer: 0x17005dc70>: calling -display has no effect.

更有趣的是,即使我像这样覆盖它,它也会出现:

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

据我了解,这根本不可能有任何区别,因为根据 OOP 的基本原则,这样的覆盖(仅调用基类)不应该修改程序的行为。

这个错误信息到底是什么意思?为什么会出现?

4

1 回答 1

1

UIViewAPI 是旧的,它不是一个好的 API。UIView和之间的相互作用CALayer相当复杂。有趣的是,系统会检查您是否正在覆盖drawRect. 这就是UIView文档中出现此警告的原因:

drawRect: - 如果您的视图绘制自定义内容,请实施此方法。如果您的视图不执行任何自定义绘图,请避免覆盖此方法。

没有必要打电话[super drawRect:rect]。超类不进行实际绘图。如果您不想绘制任何东西,请完全删除该方法。如果您想在图层上绘制自定义内容,请不要调用super(仅当您知道超类也已覆盖时才调用 super drawRect)。

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

在你的情况下,我相信这个电话[super drawRect]做了一些不应该发生的事情。

于 2015-03-27T12:59:43.840 回答