2010-04-01 15 views

Odpowiedz

15

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:

+0

Świetnie. to działa dla mnie, bardzo dziękuję –

+1

, jaka jest wartość "łagodzenia". – sathiamoorthy

+0

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. –

8

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 
+1

Nie zapomnij również ustawić ** removedOnCompletion ** właściwości animacji na ** NO ** 'animation.removedOnCompletion = NO;' – krpec

0

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.

+0

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

3

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"]; 
+1

nie działa dla mnie –

1

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; 
Powiązane problemy