2010-04-08 16 views
15

Podążam za przykładem w dolnej części strony, aby wywołać funkcję animationDidStop.Delegat CABasicAnimation do animacjiDidStop?

http://www.informit.com/articles/article.aspx?p=1168314&seqNum=2

Autorka mówi:

Mam obiekt, który został zaprojektowany specjalnie, aby być delegatem animacje i wszystko co robi to trzymać referencję do obiektu docelowego, zaakceptować animationDidStop: wiadomość, a następnie zwolnij się.

To sugeruje, że nie należy robić:

[animation setDelegate:self]; 

Jestem całkiem nowy w programowaniu aplikacji może ktoś przedstawi w jaki sposób mogę to zrobić? Lub wyślij mi link tam, gdzie jest wyjaśniony.

+0

masz na myśli, że powinien zrobić [zestaw animacjiDelegate: self]; ? Artykuł mówi, aby to nazwać. –

+1

__Pamiętaj, że 'delegat' CAAnimation' jest silny, więc możesz potrzebować ustawić go na 'nil', aby uniknąć cykli zatrzymania! __ –

Odpowiedz

38

Wdrożenie:

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag 

na swoim obiektu delegowanego. Możesz także zaimplementować:

- (void)animationDidStart:(CAAnimation *)theAnimation 

, aby odebrać połączenie, gdy rozpocznie się animacja.

Aby uzyskać więcej informacji, zobacz sekcję delegatów: http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Reference/CAAnimation_class/Introduction/Introduction.html

+8

To jest poprawna odpowiedź. Dlaczego ktoś zagłosował na to, zwłaszcza bez komentarza? – thefaj

+0

Dlaczego więc dokumentacja mówi, że należy użyć "animationDidStop: (NSString *) animationID finished: (NSNumber *) finished context: (void *)" w sekcji UIView klasy Reference dla metody setAnimationDidStopSelector? – CommaToast

0

prostu ustawienie

[UIView setAnimationDelegate:self]; 

nie wywoła żadnej z metod animacji przekazywać podczas uruchamiania animacji lub kończy.

Ten problem można rozwiązać za pomocą jednego z następujących obejść.

1) W sekcji realizacji dodać

@implementation MyViewWithAnimations <UIApplicationDelegate> 


2) W animacji rozpocząć-commit-block dodać

[UIView setAnimationWillStartSelector:@selector(animationDidStart:)]; 
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:)]; 


3) Czy to, co sugeruje, Apple i użyć blok oparte na metodach animacji.

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIView_Class/UIView/UIView.html

+0

Dowolne głosowanie bez komentarza nikomu nie pomaga. – lindinax

+0

Mimo że nie byłem tym, który przegrał, jestem pewien, że stało się tak dlatego, że dodajesz klasę "UIApplicationDelegate", nawet jeśli nie ma to nic wspólnego z delegatem animacji. –

4

Czasami ustalenie rzeczywistej wartości twojego warstwy do tej toValue gdy animacja uzupełnia jest wymagane. Kiedy jest to bardziej złożona animacja, taka jak animowanie kolorów warstwy CAGradientLayer, jest to wymagane.

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag 
{ 
    self.gradientLayer.colors = (NSArray *)((CABasicAnimation*)theAnimation).toValue; 
}