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: 方法的主要内容,如果未能解决你的问题,请参考以下文章

IOS中drawLayer使用CGContent

CALayer 从当前值淡出

vImageAlphaBlend 崩溃

动画边界更改时具有 CALayer 有线效果的自定义视图

动画边界更改时具有 CALayer 有线效果的自定义视图

如何将 UIView 添加到 CALayer