Estoy tratando de establecer un CAEmitterLayer
para hacer un efecto confeti, y me he encontrado con dos problemas:CAEmitterLayer emite partículas no deseados al azar en eventos de toque
- Cada vez que me puse la
birthRate
en mis células para algo diferente de cero para comenzar la animación obtengo una ráfaga de celdas colocadas al azar en la pantalla, que se animan normalmente, y luego el emisor continúa emitiendo correctamente después de eso. - Cada vez que el
emitterCells
dibuja cosas en la pantalla, cada vez que toco la pantalla, el emisor dibujaemitterCells
en (al parecer) ubicaciones al azar que existen durante un tiempo (aparentemente) aleatorio. Nada en el emisor está vinculado a ningún evento táctil (es decir, no estoy dibujando intencionadamente nada en un evento táctil), pero la capa está en una vista que tiene múltiples vistas incrustadas. Cuanto más toco, más células aparecen.
Aquí está mi código para configurar el emisor, y luego arrancar y parar que (una vez que he llamado la función de parada, a continuación, toca el cese pantalla de creación de nuevos elementos al azar):
- (void)setupConfetti
{
self.confettiLayer = [CAEmitterLayer layer];
[self.view.layer addSublayer:self.confettiLayer];
[self.view.layer setNeedsDisplay];
self.confettiLayer.emitterPosition = CGPointMake(1024.0/2,-50.0);
self.confettiLayer.emitterSize = CGSizeMake(1000.0, 10.0);
self.confettiLayer.emitterShape = kCAEmitterLayerLine;
self.confettiLayer.renderMode =kCAEmitterLayerUnordered;
CAEmitterCell *confetti = [CAEmitterCell emitterCell];
confetti1.contents = (id)[[UIImage imageNamed:@"confetti.png"] CGImage];
confetti.emissionLongitude = M_PI;
confetti.emissionLatitude = 0;
confetti.lifetime = 5;
confetti.birthRate = 0.0;
confetti.velocity = 125;
confetti.velocityRange = 50;
confetti.yAcceleration = 50;
confetti.spin = 0.0;
confetti.spinRange = 10;
confetti.name = @"confetti1";
self.confettiLayer.emitterCells = [NSArray arrayWithObjects:confetti, nil];
}
para iniciar el confeti:
- (void)startConfettiAnimation
{
[self.confettiLayer setValue:[NSNumber numberWithInt:10.0] forKeyPath:@"emitterCells.confetti.birthRate"];
}
Y para detenerlo:
- (void)stopConfettiAnimation
{
[self.confettiLayer setValue:[NSNumber numberWithInt:0.0] forKeyPath:@"emitterCells.confetti.birthRate"];
}
Nuevamente, una vez que se inicia, después de la ráfaga inicial de elementos aleatorios, esto funciona bien: todo se anima normalmente, y cuando birthRate se pone a cero, finaliza con gracia. Simplemente parece responder a eventos táctiles, y no tengo idea de por qué. Intenté agregar el emitterLayer a una vista diferente, inhabilitar la interacción del usuario en esa vista y luego agregarla como una subvista de la vista principal, y eso no pareció funcionar.
¡Cualquier ayuda/idea sería muy apreciada!
Gracias, Sam
¿Has descubierto algo sobre esto? Estoy teniendo el mismo problema también. Parece una "característica" muy innecesaria para mí. –
¿Quizás después de un año desde el último comentario en esta publicación, alguien encontró la solución a este problema? Veo este problema en cada proyecto fundado en la web que usa la clase CAEmitterLayer. Puedes probar incluso con este tutorial: http://www.raywenderlich.com/6063/uikit-particle-systems-in-ios-5-tutorial. Simplemente elimine el manejo de toques de vc y reduzca birthRate a 1, por ejemplo, y comience a grabar en cualquier lugar. Parece que todas las partículas vivas se duplicaron después del toque. El problema aparece solo en los dispositivos, no en el simulador. –