Search code examples
iphoneobjective-ccalayercaemitterlayer

Method sent to CAEmitterLayer but goes to CALayer


I set up a CAEmitterLayer and it works perfectly:

-(void)awakeFromNib
{
    //set ref to the layer
    emitter = (CAEmitterLayer*)self.layer;
    emitter.emitterPosition = CGPointMake(160, 270);

    CAEmitterCell* grassLeft = [self getEmitter];
    CAEmitterCell* grassRight = [self getEmitter];
    grassLeft.emissionLongitude = M_PI*1.20;
    grassRight.emissionLongitude = M_PI*1.80;

    //add the cell to the layer and we're done
    emitter.emitterCells = [NSArray arrayWithObjects:grassLeft,grassRight,nil];


}

But I added one line of code:

-(void)awakeFromNib {
    //set ref to the layer
    emitter = (CAEmitterLayer*)self.layer;
    emitter.emitterPosition = CGPointMake(160, 270);
    emitter.backgroundColor = [[UIColor redColor] CGColor];

    CAEmitterCell* grassLeft = [self getEmitter];
    CAEmitterCell* grassRight = [self getEmitter];
    grassLeft.emissionLongitude = M_PI*1.20;
    grassRight.emissionLongitude = M_PI*1.80;

    //add the cell to the layer and we're done
    emitter.emitterCells = [NSArray arrayWithObjects:grassLeft,grassRight,nil];


}

And all of a sudden, I get Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CALayer setEmitterPosition:]: unrecognized selector sent to instance 0x7546390'. The debugging window says that object is a CAEmitterLayer, not just a CALayer. And when I delete that line of code, the problem persists.


Solution

  • I'm assuming this code is within a custom UIView, if so, make sure that you have overridden:

    + (Class)layerClass
    

    So it should be:

    + (Class)layerClass
    {
        return [CAEmitterLayer class];
    }
    

    This will ensure that inside your UIView where you have

    emitter = (CAEmitterLayer*)self.layer;
    

    It is returning a CAEmitterLayer, rather than a normal CALayer which it does by default.

    I'm guessing this is the issue since the error is stating you are trying to call a method that only exists on CAEmitterLayer on a normal CALayer.