注意:我不想寻求解决实际问题。我出于好奇而问。
我有一个自定义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的基本原则。
这条错误信息究竟是什么意思?为什么会出现?
答案 0 :(得分:1)
UIView
API 旧,它不是一个不错的API。 UIView
和CALayer
之间的互动相当复杂。有趣的是,系统会检查您是否覆盖drawRect
。这就是UIView
文档中出现此警告的原因:
drawRect: - 如果您的视图绘制自定义内容,请实现此方法。如果您的视图没有进行任何自定义绘图,请避免覆盖此方法。
无需致电[super drawRect:rect]
。超类不执行实际绘图。如果您不想绘制任何内容,请完全删除该方法。如果要在图层上绘制自定义内容,请不要调用super
(仅当您知道超类还覆盖了drawRect
时才调用super)。
如果直接子类化UIView,则此方法的实现不需要调用super。但是,如果要为不同的视图类创建子类,则应在实现中的某个时刻调用super。
在你的情况下,我相信电话[super drawRect]
会做一些不应该发生的事情。