Próbuję założyć CAEmitterLayer
aby efekt konfetti i Zabrakło mi na dwie kwestie:CAEmitterLayer emituje losowych zdarzeń niepożądanych cząstek na dotykowych
- Ilekroć ustawić
birthRate
na moich komórek do coś niezerowego, aby rozpocząć animację Dostaję falę komórek umieszczonych losowo na ekranie, które normalizują się normalnie, a następnie emiter nadal emituje prawidłowo po tym. - Gdy tylko
emitterCells
rysuje rzeczy na ekranie, za każdym razem, gdy dotykam ekranu, emiter rysujeemitterCells
w (pozornie) losowych lokalizacjach, które istnieją (na pozór) losową ilość czasu. Nic w emiterach nie jest powiązane z żadnymi zdarzeniami dotyku (tj. Nie zamierzam rysować niczego na zdarzeniu dotykowym), ale warstwa jest w widoku, który ma wiele osadzonych widoków. Im więcej się dotykam, tym więcej komórek się pojawi.
Oto mój kod do konfigurowania emiter, a następnie uruchamianie i zatrzymywanie go (raz byłem nazywany funkcja stop, potem krany na przestają ekranu tworzenia nowych elementów losowych):
- (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];
}
aby rozpocząć konfetti:
- (void)startConfettiAnimation
{
[self.confettiLayer setValue:[NSNumber numberWithInt:10.0] forKeyPath:@"emitterCells.confetti.birthRate"];
}
i zatrzymać go:
- (void)stopConfettiAnimation
{
[self.confettiLayer setValue:[NSNumber numberWithInt:0.0] forKeyPath:@"emitterCells.confetti.birthRate"];
}
Znowu, po uruchomieniu, po początkowym przypływie losowych elementów, działa to dobrze: wszystko ożywia się normalnie, a kiedy wartość birthRate jest później ustawiona na zero, kończy się z gracją. Wydaje się, że reaguje na zdarzenia dotykowe i nie mam pojęcia dlaczego. Próbowałem dodać emitterLayer do innego widoku, wyłączając interakcję użytkownika z tym widokiem, a następnie dodając go jako podzbiór głównego widoku, który nie działał.
Każda pomoc/wgląd byłby mile widziany!
Dzięki Sam
Dowiedziałeś się czegoś na ten temat? Mam ten sam problem. Wydaje mi się to bardzo niepotrzebną "cechą". –
Może po roku od ostatniego komentarza w tym poście ktoś znalazł rozwiązanie tego problemu? Widzę ten problem w każdym projekcie utworzonym w Internecie, który używa klasy CAEmitterLayer. Możesz spróbować skorzystać z tego samouczka: http://www.raywenderlich.com/6063/uikit-particle-systems-in-ios-5-tutorial. Wystarczy usunąć obsługę dotknięć z vc i zmniejszyć birthRate do 1 na przykład i zacząć nagrywać w dowolnym miejscu. Wszystkie żywe cząstki wydają się podwoić po dotknięciu. Problem pojawia się tylko na urządzeniach, a nie na symulatorze. –