2014-03-26 60 views
1

我正嘗試在自定義類中創建一個動畫,該動畫將在像所有UIView元素一樣的動畫塊中觸發。獲取自定義類中的動畫持續時間

我的課:

@interface SmileyFace : NSObject 
@property (strong, nonatomic) uicolor* color; 
@end 

我改變了色彩搭配:

[UIView animateWithDuration:3 animations:^{ 
      myView.frame = newFrame; 
      smileyView.color = [uicolor redcolor]; 
     }]; 

現在,在屬性顏色的二傳手, 我需要找出是否應該動畫,並添加一個自定義動畫:

-(void)setColor:(UIColor *)color 
{ 
    _color = color; 
    NSLog(@"new frame"); 
    if ([CATransaction animationDuration] > 0) 
     [self changeColor:color withAnimationWithDuration:[CATransaction animationDuration]]; 
    else 
     [self changeColor:color]; 
} 

由於我的對象是一個自定義對象,我不是確定如何訪問動畫的持續時間。 從CAtransaction,我總是得到0.25作爲持續時間。

任何幫助將不勝感激!

+0

SmileyFace爲什麼不從UIView繼承? –

+0

因爲它實際上不是一個視圖,而是一個通信機制,它不能從UIView繼承,但行爲非常相似 –

+0

那麼動畫究竟是如何工作的呢?是什麼'presentationSmiley'? –

回答

0

由於視圖並未使用事務來完成動畫,因此您無法從事務中獲取持續時間,因此它使用委託方法向該圖層提供動畫。這顯然不適用於你,因爲你的自定義對象不是視圖。

可以詢問一些其他類似的屬性(如的backgroundColor)的作用的觀點,看它是否返回CAAnimation在這種情況下,你可以從中讀取時間,或者如果它返回在這種情況下你NSNull不應該動畫。雖然這會起作用,但我認爲這是一個醜陋而且很冒險的解決方案。 (我甚至不會向你展示代碼,因爲我不想鼓勵人們在沒有完全理解的情況下這樣做(即能夠自己編寫代碼))

既然你的SmileyFace甚至不是一個視圖(我不知道你爲什麼要製作一些甚至不是視圖的動畫),我認爲這是一個更清晰的解決方案,以揭示如果持續時間大於0時可用於觸發動畫的方法。

CGFloat duration = 3.0; 
[UIView animateWithDuration: duration animations:^{ 
    myView.frame = newFrame; 
    [smileyView setColor:[UIColor redColor] duration:duration]; 
}];