2010-07-28 127 views
1

我特林當動畫的啓動和停止,所以我的代碼是得到通知:爲什麼animationDidStart:不起作用?

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

我實現這些2種方法,但animationDidStop:finished:得到了通知,並且animationDidStart:沒有。

這裏是我的實現:

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { 
} 

- (void)animationDidStart:(CAAnimation *)anim 
{ 
} 

當我試圖直接調用animationDidStart:animationDidStop:finished:,我的應用程序崩潰,並報道說,選擇找不到。但根據CAAnimation.h中的以下幾行,如果我導入QuatzCore框架,NSObject的所有實例都應該響應這兩種方法。我的理解是否正確?

/* Delegate methods for CAAnimation. */ 

@interface NSObject (CAAnimationDelegate) 

/* Called when the animation begins its active duration. */ 

- (void)animationDidStart:(CAAnimation *)anim; 

/* Called when the animation either completes its active duration or 
* is removed from the object it is attached to (i.e. the layer). 'flag' 
* is true if the animation reached the end of its active duration 
* without being removed. */ 

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag; 

@end 

回答

1

根據UIView文檔,setAnimationWillStartSelector:消息需要一個選擇器,其簽名像+ (void)beginAnimations:(NSString *)animationID context:(void *)context。您提供的選擇器有錯誤的簽名,因此不會被調用。 NSObject的CAAnimationDelegate類別甚至沒有記錄,所以你可能需要確切知道你在做什麼。然而你的問題是錯誤的選擇器簽名。

+0

我有點困惑。我認爲CAAnimationDelegate類別與NSObject記錄在: http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Reference/CAAnimation_class/Introduction/Introduction.html#//apple_ref/occ/instm/NSObject/ animationDidStart: – 2010-07-28 16:51:27

+0

關於術語的一個詞:'CAAnimation'不是一個「類別」,而是「NSObject」的「繼承」,它只是說實際上是一個對象。 'CAAnimationDelegate'是一個協議,它是一組規則,告訴你應該/可能提供哪些方法來建立一些交互。 – mvds 2010-07-28 17:36:41

+0

@MQ顧:你是對的,我沒有足夠的時間進行研究,對不起!但它不會改變你的問題。 CAAnimation是一個抽象類,由UIView使用(實現)來執行他基本的動畫。你需要使用UIView定義的選擇器來使你的代碼工作。 – thatsdisgusting 2010-07-28 22:00:04

2

閱讀精細的手工,我看到

The selector should have the same arguments as the beginAnimations:context: method, 
an optional application-supplied identifier and context. Both of these arguments can 
be nil. 

所以,我想你至少可以選擇吃正確的論點。

看來你正在實施一個不同的協議,看看UIView文檔。

+0

是的,這應該是爲什麼委託是不叫的原因。我會盡快嘗試,並在此處添加報告。 但我仍然有一點困惑,CAAnimationDelegate類別NSObject應該是有效的,當我直接調用它們。 – 2010-07-28 16:58:57

+0

??不完全瞭解你,但它不是那樣工作。您設置委託和選擇器。然後選擇器被調用2個參數,標識符和上下文(可能只是'nil')。而已。沒有'NSObject',沒有'CAAnimationDelegate',沒有類別。 'CAAnimation'只是另一種動畫事物的方式。不要將它與'UIView'動畫方式混合在一起。 – mvds 2010-07-28 17:34:49

0

在你的UIView動畫塊,設置選擇應該是這樣的:

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