Je suis en train de configurer un CAEmitterLayer
faire un confetti effet, et j'ai couru en deux questions:
- Chaque fois que j'ai défini l'
birthRate
sur mes cellules à quelque chose de non-zéro pour démarrer l'animation je reçois une avalanche de cellules placées au hasard sur l'écran, qui animent normalement, puis l'émetteur continue à émettre correctement par la suite. - Chaque fois que l'
emitterCells
sont le dessin des choses sur l'écran, une fois que je touche l'écran, l'émetteur attireemitterCells
dans (apparemment) des emplacements aléatoires qui existent pour un (presque) aléatoire quantité de temps. Rien dans l'émetteur est lié à un événement de touche (c'est à dire que je ne suis pas intentionnellement dessin quoi que ce soit sur un événement tactile), mais la couche est dans une vue qui a plusieurs des vues intégrées. Le plus que je touche, plus le nombre de cellules se montrer.
Voici mon code pour la configuration de l'émetteur, puis le démarrage et l'arrêt, il (une fois que j'ai appelé la fonction d'arrêt, puis appuis sur l'écran cesse de créer de nouveaux éléments aléatoires):
- (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];
}
Pour lancer les confettis:
- (void)startConfettiAnimation
{
[self.confettiLayer setValue:[NSNumber numberWithInt:10.0] forKeyPath:@"emitterCells.confetti.birthRate"];
}
Et pour l'arrêter:
- (void)stopConfettiAnimation
{
[self.confettiLayer setValue:[NSNumber numberWithInt:0.0] forKeyPath:@"emitterCells.confetti.birthRate"];
}
Encore une fois, une fois qu'il est démarré, après la première vague des éléments aléatoires, cela fonctionne bien: tout ce qui anime normalement, et quand le taux de natalité est ensuite remis à zéro, il se termine normalement. Il semble juste de répondre à des événements tactiles, et je n'ai aucune idée pourquoi. J'ai essayé d'ajouter le emitterLayer un autre point de vue, la désactivation de l'interaction de l'utilisateur sur ce point de vue, et puis l'ajouter comme une sous-vue de la vue principale, et qui n'a pas l'air de fonctionner.
Toute aide/insight serait bien apprécié!
Merci, Sam