2010-04-08 9 views
15

Ich folge dem Beispiel unten auf der Seite, um eine animationDidStop Funktion aufzurufen.CABasticAnimation Delegate für animationDidStop?

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

Der Autor sagt:

Ich habe ein Objekt, das speziell entwickelt, um die Delegierten von Animationen konzipiert ist und alle es tut, ist ein Verweis auf das Zielobjekt zu halten, die animationDidStop akzeptieren: Nachricht und dann selbst loslassen.

Dies lässt vermuten, Sie nicht tun sollten:

[animation setDelegate:self]; 

Ich bin ziemlich neu für App-Programmierung kann jemand beschreiben, wie ich dies tun könnte? Oder senden Sie mir einen Link, wo es erklärt wird.

+0

Sie meinen, es sollte tun [Animation setDelegate: self]; ? Der Artikel sagt, das zu nennen. –

+1

__Beachten Sie, dass '' Delegate 'CAAnimation' stark ist, also müssen Sie es möglicherweise auf 'Null' setzen, um Retain-Zyklen zu vermeiden! __ –

Antwort

38

Implement:

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

auf Ihrem Delegatobjekt. Sie können auch implementieren:

- (void)animationDidStart:(CAAnimation *)theAnimation 

, um einen Anruf zu erhalten, wenn die Animation startet.

Weitere Informationen finden Sie in der Delegierten Abschnitt: http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Reference/CAAnimation_class/Introduction/Introduction.html

+8

Dies ist die richtige Antwort. Warum hat jemand das abgelehnt, vor allem ohne Kommentar? – thefaj

+0

Warum sagt die Dokumentation dann 'animationDidStop: (NSString *) animationID beendet: (NSNumber *) beendeter Kontext: (void *)' im UIView-Klassenreferenzabschnitt für die setAnimationDidStopSelector-Methode? – CommaToast

0

Gerade Einstellung

[UIView setAnimationDelegate:self]; 

wird nicht der Animation Delegatmethoden aufrufen, wenn die Animation beginnt oder endet.

Dieses Problem kann durch eine der folgenden Problemumgehungen behoben werden.

1) in Ihrer Implementierung Abschnitt hinzufügen

@implementation MyViewWithAnimations <UIApplicationDelegate> 


2) In der Animation beginnen Commit-Block

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


3) fügen Sie, was Apple schlägt vor, und verwenden Sie den Block -basierte Animationsmethoden statt.

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

+0

Down Voting ohne einen Kommentar zu hinterlassen hilft niemandem. – lindinax

+0

Auch wenn ich nicht derjenige gewesen bin, der das Downvoting durchgeführt hat, bin ich mir sicher, dass es passiert ist, weil Sie Ihrer Klasse das "UIApplicationDelegate" hinzufügen, obwohl es nichts mit dem Delegaten der Animation zu tun hat. –

4

Manchmal Ihre Schicht des Istwert den toValue einstellen, wenn die Animation benötigt, abgeschlossen ist. Wenn es sich um eine komplexere Animation handelt, z. B. um die Farben einer CAGradiantLayer zu animieren, ist dies erforderlich.

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