我试图用一系列的CALayers作为子层,需要比平时更精细的绘画。我以前使用过CATiledLayer
,我认为使用子层会比较容易,如果不太挑剔的话。我想我执行一个[self.layer addSublayer:sublayer]
,设置新子层的委托,然后在drawLayer:inContext:
方法中画出所有我想要的。但令我大吃一惊的是,我的应用程序在addSubview:
(没有ib)或者在调用堆栈(在使用IB时)更高的地方崩溃了。
根据文件…
《AA>》似乎明确规定了我在做什么,但每次都会崩溃:
在ios中,如果层与uiview对象关联,则必须将此属性设置为拥有该层的视图。
但很明显,我搞砸了。谢天谢地,它很容易复制。你能给我解释一下我应该如何使用代表任务的子层来接收正确的CC调用而不崩溃吗?
复制步骤
将其放入使用interface builder显示在屏幕上的自定义视图的类中(或重写要调用的init):
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
CALayer *sublayer = [CALayer layer];
sublayer.frame = self.layer.bounds;
// Disable or enable this next line to
// resolve or trigger an EXC_BAD_ACCESS crash.
//
sublayer.delegate = self;
[self.layer addSublayer:sublayer];
[self.layer setNeedsDisplay];
}
return self;
}
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
CGContextSetFillColorWithColor(ctx, [[UIColor greenColor] CGColor]);
CGContextFillRect(ctx, self.bounds);
}
如果运行此代码,则应用程序将崩溃。注意
drawLayer:inContext:
行。如果禁用该应用程序,您的应用程序将运行,但该子层从不调用initWithFrame:
方法。我做错什么了?
最佳答案
这不起作用,因为您正在子类化的uiview(我假设它是uiview)已经是它自己的calayer的委托,它不能同时是多个calayer的委托。这篇文章有更多的细节:
Using CALayer Delegate