Stosuję CABasicAnimation dla właściwości position warstwy, która dobrze się animuje, ale po zakończeniu animacji powraca do pierwotnej pozycji, jak tego uniknąć, i aby obraz pozostał w animowanej pozycji ?CABasicAnimation nie zmienia swojej właściwości position po zakończeniu animacji
Odpowiedz
Istnieje kilka różnych sposobów rozwiązania tego problemu. Moim ulubionym jest ustawienie obiektu na końcu animacji i użycie parametru fromValue zamiast doValue w celu utworzenia animacji. Możesz również ustawić zarówno od wartościValue, jak iValue, aby utworzyć ten efekt. tj
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
animation.duration = 1.0;
animation.fromValue = [NSValue valueWithCGPoint:startPoint];
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
viewToAnimate.center = endPoint;
[viewToAnimate.layer addAnimation:animation forKey:@"slide"];
Innym sposobem, aby to zrobić, to ustawić siebie jako delegat i wdrożenie:
Musisz ustawić pozycję końcową. Jeśli użyjesz tylko animacji fromValue i do Value, nastąpi powrót do pierwotnego punktu początkowego. Animacja korzysta z kopii widoku/warstwy podczas jej "odtwarzania", a następnie animacja pokaże oryginalny widok/warstwę po zakończeniu.
Jeśli nie zostanie to wyraźnie ustawione, będzie wyglądać, jakby się cofało, nawet jeśli widok/warstwa nigdy się nie poruszała.
StartPoint i endPoint to CGPoints, a myView to UIView, który jest animowany.
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
animation.duration = .3;
animation.fromValue = [NSValue valueWithCGPoint:startPoint];
animation.toValue = [NSValue valueWithCGPoint:endPoint];
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
[myView.layer addAnimation:animation forKey:@"position"];
myView.layer.position = endPoint; // Must set end position, otherwise it jumps back
Nie zapomnij również ustawić ** removedOnCompletion ** właściwości animacji na ** NO ** 'animation.removedOnCompletion = NO;' – krpec
Jeśli spojrzeć na docs dla addAnimation: forKey :, mówi „Zazwyczaj jest niejawnie wywoływany”. Innymi słowy, nie powinieneś nazywać tego bezpośrednio. Jesteś rzeczywiście ma na celu należy wykonać następujące czynności zamiast, co jest jeszcze łatwiejsze niż ustawienie zi do wartości, po prostu ustawić wartości bezpośrednio na warstwie:
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
animation.duration = .3;
myLayer.actions = @{@"opacity": animation};
myLayer.opacity = 0;
Ten znikną warstwę zero kryciem.
Nie widzę tego w dokumentach, czy to może być OSX? tylko? Patrzę na CALayer [tutaj] (https://developer.apple.com/library/ios/documentation/graphicsimaging/reference/CALayer_class/Introduction/Introduction.html#//apple_ref/occ/instm/CALayer/addAnimation: forKey :). Większość samouczków Apple zawiera wywołanie metody 'addAnimation: forKey:' np. [tutaj] (https://developer.apple.com/library/ios/documentation/cocoa/conceptual/coreanimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html). – bcattle
Aby ustawić obiekt na końcu animacji tylko napisać kod jak ten
#import <QuartzCore/QuartzCore.h>
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
animation.duration = 1.0;
animation.fromValue = [NSValue valueWithCGPoint:startPoint];
animation.timingFunction = [CAMediaTimingFunction functionWithName:easing];
animation.fillMode = kCAFillModeForwards; // This line will stop the animation at the end position of animation
animation.autoreverses = NO;
viewToAnimate.center = endPoint;
[viewToAnimate.layer addAnimation:animation forKey:@"slide"];
nie działa dla mnie –
można po prostu ustawić removedOnCompletion na NIE, jeśli chcesz zachować ostateczną wartość. I nie zapomnij ustawić fillMode.
animation.fillMode = kCAFillModeForwards; //The receiver remains visible in its final state when the animation is completed.
animation.removedOnCompletion = NO;
Świetnie. to działa dla mnie, bardzo dziękuję –
, jaka jest wartość "łagodzenia". – sathiamoorthy
Sądzę, że jeśli ustawienie wygładzania nie jest ustawione, to ładuje się wstępnie do Linearnego, ale dodanie go powinno być proste, jeśli zależy Ci na łatwości/łatwości lub łatwości wchodzenia/wychodzenia. –