为什么重写UIView.drawRect会使“调用-display无效”消息出现?

时间:2015-03-27 11:57:09

标签: ios objective-c uiview metal

注意:我不想寻求解决实际问题。我出于好奇而问。

我有一个自定义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的基本原则。

这条错误信息究竟是什么意思?为什么会出现?

1 个答案:

答案 0 :(得分:1)

UIView API ,它不是一个不错的API。 UIViewCALayer之间的互动相当复杂。有趣的是,系统会检查您是否覆盖drawRect。这就是UIView文档中出现此警告的原因:

  

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

无需致电[super drawRect:rect]。超类不执行实际绘图。如果您不想绘制任何内容,请完全删除该方法。如果要在图层上绘制自定义内容,请不要调用super(仅当您知道超类还覆盖了drawRect时才调用super)。

  

如果直接子类化UIView,则此方法的实现不需要调用super。但是,如果要为不同的视图类创建子类,则应在实现中的某个时刻调用super。

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