2013-08-17 49 views
5

我有一個CALayer子類與浮動animAngle作爲屬性標記爲@dynamic。我已經爲子類實施了方法actionForKeyinitWithLayer,needsDisplayForKeydrawInContext。 爲actionForKey的定義如下CALayer子類不動畫屬性更改

- (id<CAAction>)actionForKey:(NString *)event { 
    if([event isEqualToString:@"animAngle"]) { 
     return [self animationForKey:event]; 
    } 
    return [super actionForKey:event]; 
} 

而且

- (CABasicAnimation *)animationForKey:(NSString *)key 
{ 
    NSString *animValue = [[self presentationLayer] valueForKey:key];// Logs as 0 
    CABasicAnimation *anim; 

    if([key isEqualToString:@"animAngle"]) { 
     anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
     anim.repeatCount = HUGE_VAL; 
     anim.autoreverses = YES; 
     //anim.fromValue = [[self presentationLayer] valueForKey:key]; // setting animation value from layer property as in here does not work. 
     anim.fromValue = [NSNumber numberWithFloat:0.5f];   // This works 
    } 
    anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
    anim.duration = 0.11; 
    return anim; 
} 

在一些其它類:

myCASublayer.animAngle = 0.5f; 

不知何故被返回的CABasicAnimation無法正常使用層 「animAngle」屬性。 我在這裏可能會做錯什麼?

+0

一個被稱爲'animAngle'另一個是'wiggleAngle' –

+0

@RobvanderVeer:對不起,這是一個錯字。它的動漫角色。 – rawatm

+0

@ basstrekerk87,下次更好複製/粘貼,保存錯誤!你知道你實際上不需要手動縮進代碼嗎?使用按鈕或從3反引號開始(') –

回答

1

CocoaHeads Session: Rob Napier on Animating Custom Layer Properties是一個很好的關於自定義動畫的演示文稿。

CALayers討厭做得出;)

+0

謝謝,它的工作原理。但是如果重複計數的動畫是無限的,它只會給動畫一次。 drawInContext是否不需要重複動畫? – rawatm

+0

@ basstrekker87我不確定key的動作是否可以支持重複。 AFAIK它或多或少是一個從舊值到新值的隱式動畫。 –

+0

是的,這可能是CALayers討厭做的情況:-) – rawatm

1

如果animAngle@property - 您必須爲此屬性指定accessors
當您將屬性標記爲@dynamic時,這意味着您將在運行時動態地提供這些方法的實現。所以,如果你不提供財產訪問者,你不能訪問它。

+0

嘗試爲animAngle創建訪問器,但仍然無法正常工作。 CALayer子類需要@dynamic,它爲屬性本身提供了實現,但是anyhows的變化仍然沒有得到更新。 – rawatm

+0

這對CALayer來說並不是真的。他們是...「特別」;) –

+0

@DavidRönnqvist:什麼不真實。 Lexandr的回答或我添加的評論。 – rawatm