CALayer 没有实现自定义 drawLayer:inContext: 方法
Posted
技术标签:
【中文标题】CALayer 没有实现自定义 drawLayer:inContext: 方法【英文标题】:CALayer not implementing custom drawLayer:inContext: method 【发布时间】:2012-07-17 11:02:44 【问题描述】:我在研究 CALayers 时看到了这个solution。我正在寻找一种在具有多个子层的 UIView 中实现自定义绘图的方法。我这样命名我的子层:
layer1.name = @"Back";
layer2.name = @"Middle";
layer3.name = @"Front";
我创建了由这些层实现的自定义方法
-(void)drawBackLayer:(CALayer *)layer inContext:(CGContextRef)ctx
-(void)drawMiddleLayer:(CALayer *)layer inContext:(CGContextRef)ctx
-(void)drawFrontLayer:(CALayer *)layer inContext:(CGContextRef)ctx
问题是这些方法没有实现,而是被视图根层使用的drawLayer:inContext:
实现了四次。这意味着自定义层实现了此方法而不是自定义方法。谁能给我解释一下为什么?
注意:我在链接中提到的解决方案是 Dave Lee 提供的代码。
【问题讨论】:
【参考方案1】:UIView 使用的层必须是实现这些消息的自定义 CALayer。获取 UIView 子类以使用特定层的方式是通过类方法“+(Class)layerClass”。
所以: - 子类化 UIView(或 UIImageView 等的子类) - 实现layerClass方法,返回[MyCALayer class];
现在该视图将使用您的 CALayer 子类。
【讨论】:
所以如果我使用UIView的层而不是自定义层,并且我决定覆盖+ (Class)layerClass
来实现自定义层,这是否意味着我不能再使用drawLayer:inContext:
UIView 的 layer 方法了吗?
一点也不。通过使用这种技术,您可以将 UIView 子类添加到您选择的 CALayer 子类(即 CATiledlayer 或您自己的 CALayer 子类)。由于它是一个子类,它将实现所有 CALayer 功能,以及您可能想要添加的一些附加方法(如上所述)。以上是关于CALayer 没有实现自定义 drawLayer:inContext: 方法的主要内容,如果未能解决你的问题,请参考以下文章