Sto cercando di creare un CAEmitterLayer
a fare un effetto coriandoli, e ho incontrato due problemi:CAEmitterLayer emette particelle indesiderate casuali su eventi touch
- Ogni volta che ho impostato il
birthRate
sulle mie cellule a qualcosa di diverso da zero per avviare l'animazione ottengo una raffica di celle posizionate casualmente sullo schermo, che animano normalmente, e poi l'emettitore continua ad emettere correttamente dopo di ciò. - Ogni volta che lo
emitterCells
disegna sullo schermo, ogni volta che tocco lo schermo, l'emettitore disegnaemitterCells
in posizioni (apparentemente) casuali che esistono per una quantità (apparentemente) casuale di tempo. Nulla nell'emettitore è legato ad alcun evento di tocco (ad esempio, non sto disegnando intenzionalmente nulla su un evento touch), ma il livello è in una vista che ha più viste incorporate. Più tocco, più cellule appaiono.
Ecco il mio codice per impostare l'emettitore, e poi avvio e l'arresto di esso (una volta ho chiamato la funzione di arresto, poi rubinetti sullo schermo cessate creazione di nuovi elementi casuali):
- (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];
}
per avviare il confetti:
- (void)startConfettiAnimation
{
[self.confettiLayer setValue:[NSNumber numberWithInt:10.0] forKeyPath:@"emitterCells.confetti.birthRate"];
}
E per fermarlo:
- (void)stopConfettiAnimation
{
[self.confettiLayer setValue:[NSNumber numberWithInt:0.0] forKeyPath:@"emitterCells.confetti.birthRate"];
}
Ancora una volta, una volta iniziato, dopo il turbinio iniziale di elementi casuali, funziona perfettamente: tutto si anima normalmente e quando il valore di nascita viene successivamente azzerato, termina con grazia. Sembra solo rispondere agli eventi touch, e non ho idea del perché. Ho provato ad aggiungere emitterLayer a una vista diversa, disabilitare l'interazione dell'utente su quella vista e aggiungerla come sottoview della vista principale, e non sembrava funzionare.
Qualsiasi aiuto/approfondimento sarebbe molto apprezzato!
Grazie, Sam
Hai scoperto qualcosa a riguardo? Sto avendo lo stesso problema anche io. Sembra una "caratteristica" molto inutile per me. –
Forse dopo un anno dall'ultimo commento in questo post qualcuno ha trovato la soluzione a questo problema? Vedo questo problema in ogni progetto fondato nel web che utilizza la classe CAEmitterLayer. Puoi provare anche con questo tutorial: http://www.raywenderlich.com/6063/uikit-particle-systems-in-ios-5-tutorial. Basta rimuovere la gestione dei touch da vc e ridurre birthRate a 1 per esempio, e iniziare a registrare ovunque. Tutte le particelle vere sembrano essere raddoppiate dopo aver toccato. Il problema appare solo sui dispositivi, non nel simulatore. –