2009-09-04 6 views
39

Próbuję stworzyć spadającą monetę. Obraz monety jest CALayerem z 2 CABasicAnimations na nim - spadającym i obrotowym. Kiedy spadająca animacja dobiega końca, zostaje tam. Jednak animacja rotacji, która ma być losowa i kończy się pod innym kątem za każdym razem, po prostu wraca do oryginalnego obrazu CALAyer.Po obróceniu CALayera za pomocą CABasicAnimation, warstwa przeskakuje z powrotem do jego niezablokowanej pozycji

Chcę, aby pozostała pod kątem, w którym zakończyła się animacja. Czy to możliwe? Jak mam to zrobić?

Kod:

//Moving down animation: 
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; 
anim.duration = 1; 
anim.autoreverses = NO; 
anim.removedOnCompletion = YES; 

anim.fromValue = [NSNumber numberWithInt: -80 - row_height * (8 - _col)]; 
anim.toValue = [NSNumber numberWithInt: 0]; 

//Rotation Animation: 
CABasicAnimation *rota = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; 
rota.duration = 4; 
rota.autoreverses = NO; 
rota.removedOnCompletion = NO; 
rota.fromValue = [NSNumber numberWithFloat: 0]; 
rota.toValue = [NSNumber numberWithFloat: 2.5 * 3.15 ]; 
[cl addAnimation: rota forKey: @"rotation"]; 
[cl addAnimation: anim forKey: @"animateFalling"]; 

Odpowiedz

79

mają właściwość removedOnCompletion animacji obrotową można ustawić na NO, np

rota.removedOnCompletion = NO; 

To powinno pozostawić warstwę prezentacji, gdzie to było, gdy animacja zakończona. Wartością domyślną jest TAK, która przywraca wartość modelu, tj. Zachowanie, które opisujesz.

FILLMODE należy również ustawić, tzn

rota.fillMode = kCAFillModeForwards; 
+0

Zrobiłem. Dodałem kod użyty do pytania. – Mikle

+9

rzecz wypełniona rozwiązała. Bóg wie, dlaczego to jest potrzebne :) – Mikle

+0

@Allan Każdy pomysł, dlaczego 'fillMode' musi być ustawiony na' kCAFillModeForwards'? – pixelfreak

1

Okazało się, że przez ustawienie: removedOnCompletion = NO;

nie przyniosły widoczny wyciek na instrumentach, ale nie dostał dealokowane i został gromadzenie niewielka ilość pamięci. IDK, czy to moja implementacja czy jak, ale przez dodanie removeAllAnimations na końcu animacji zdawało się usuwać tę odrobinę resztkowej pamięci.

+0

Czy jest to na symulatorze lub urządzeniu? – Pablo

+0

taaaaaaaaaaaaa, to było na symulatorze, a ja nie próbowałem na urządzeniu, co oczywiście jest prawdziwą okazją. To był bardzo mały wzrost. BUt, znalazłem to, ponieważ szukałem innego wycieku za pomocą instrumentów i widziałem dziwne zachowanie pamięci. Robiąc to odizolowałem prawdziwy wyciek, który miałem, i byłem w stanie podłączyć dziurę. Przypomnij sobie, że jest to Xcode 3.2.4, a potem otrzymałem pamięć, aby konsekwentnie powracać do numeru początkowego - co jest dobre. – yeahdixon

+1

Animujesz warstwę prezentacji. Następnie powinieneś ustawić właściwość 'transform' w warstwie modelu na wartość końcową, ale zamiast tego zachowujesz warstwę prezentacji za pomocą' removedOnCompletion = NO', kończąc na dwóch warstwach zamiast jednej. Dlatego widzisz wzrost pamięci. – Jano

4

Próbowałem obrócić strzałkę w tę iz powrotem, tak jak efekt Twitter/Facebook "Pull to Refresh".

Problem polega na tym, że robię obrót iz powrotem na tym samym UIView, więc po dodaniu

rotation.removedOnCompletion = NO; 
rotation.fillMode = kCAFillModeForwards; 

forward animacja war działa OK, ale do tyłu animacja nie działa w ogóle.

Więc dodałem ostatnią linię zaproponowaną przez yeahdixon, a ponadto ustawić widok za przekształcenie ukończonym stanie animacji za: (obrót o 180 stopni)

[myview.layer removeAllAnimations]; 
myView.transform = CGAffineTransformMakeRotation(M_PI); 

Dla „przywrócenia” animacja (do tyłu) I zrób to po zakończeniu:

myView.transform = CGAffineTransformMakeRotation(0); 

... i działa dobrze. Jakoś nie potrzebuje wywołania removeAllAnimations.

+0

Kopiowanie starych odpowiedzi, ale +1 za rzecz "removeAllAnimations". To spowodowało, że przestałem migotać. – Cyrille