我试图用一系列的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

07-26 09:43