Question

The particle system on ios7 seem to be working different, than on ios6 and ios5. The number of particles increased. The same issue happens with all particle effects in the app. The only working solution is to check, if it is ios7 and decrease the particle birth rate. Is there a better solution?

The code of particle emitter view.

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        //initialize the emitter
        _emitter = (CAEmitterLayer*)self.layer;
        _emitter.emitterPosition = CGPointMake(self.bounds.size.width /2, self.bounds.size.height/2 );
        _emitter.emitterSize = self.bounds.size;
        _emitter.emitterMode = kCAEmitterLayerAdditive;
        _emitter.emitterShape = kCAEmitterLayerRectangle;
    }
    return self;
}

- (void)didMoveToSuperview
{
    //Check if parent is initialized
    [super didMoveToSuperview];
    if (self.superview==nil) return;

    //Load png
    UIImage* texture = self.explosionImage; //[UIImage imageNamed:@"particle.png"];
    NSAssert(texture, @"particle.png not found");

    //Create a new emitter cell
    CAEmitterCell* emitterCell = [CAEmitterCell emitterCell];

    //Set the cell’s contents property to the texture you loaded
    emitterCell.contents = (__bridge id)[texture CGImage];

    //Name the cell “cell”
    emitterCell.name = @"cell";

    //Parameters
    emitterCell.birthRate = self.birthRate;// 40;//1000
    emitterCell.lifetime = 2.8;
    emitterCell.lifetimeRange = 0.7;

    //Set the cell’s color to randomly vary its components
    if (!self.explosionColor) {
        emitterCell.blueRange = 0.33;
        emitterCell.blueSpeed = -0.33;
        emitterCell.redRange = 0.33;
        emitterCell.redSpeed = -0.33;
        emitterCell.greenRange = 0.33;
        emitterCell.greenSpeed = -0.33;
    }

    //Explosion color
    if (self.explosionColor) emitterCell.color = [self.explosionColor CGColor];

    //velocity
    emitterCell.velocity = IS_IPAD?40:20;//160
    emitterCell.velocityRange = RANDOMF(10, 20);//15

    //Alpha
    emitterCell.alphaSpeed = -0.73;
    emitterCell.alphaRange = 0.9;

    //Scale
    emitterCell.scale = IS_IPAD?0.6:0.30;//0.5
    emitterCell.scaleRange = 0.6;//0.5
    emitterCell.scaleSpeed = 0;

    //Range
    emitterCell.emissionRange = M_PI*2;//2

    //Add the cell to the emitter layer
    _emitter.emitterCells = @[emitterCell];

    [self performSelector:@selector(disableEmitterCell) withObject:nil afterDelay:self.cellIsEmitting];
    [self performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:self.emittingInView];

}
Was it helpful?

Solution

When running on an iOS7, it looks as if the particle system started animating earlier than the time the emitter layer is added. It is probably a bug, and, hopefully, will be solved in future.

For now, to get a similar behavior as on iOS6, the CAEmitterLayer's beginTime can be set to the current time:

_emitter.beginTime = CACurrentMediaTime();
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top