2010-03-07 61 views
30

我有一個名爲myInt的NSInteger屬性的CALayer子類MyLayer。我真的很想通過CABasicAnimation來動畫這個屬性,但是看起來CABasicAnimation只能用於所謂的「動畫」屬性(邊界,位置等)。有什麼我可以重寫,使我的自定義myInt屬性動畫?動畫CALayer子類的自定義屬性

+1

試着讓這個屬性成爲'float'嗎? – kennytm 2010-03-07 06:23:32

回答

68

是的,這是可能的(只有在最新的核心動畫發佈,但我相信,即iPhone 3.0 +和OS X 10.6+)。

  1. 讓你的財產動態,使CA實現存取你:

    @dynamic myInt; 
    
  2. 告訴層的性質的變化需要重新劃分:

    + (BOOL)needsDisplayForKey:(NSString*)key { 
        if ([key isEqualToString:@"myInt"]) { 
         return YES; 
        } else { 
         return [super needsDisplayForKey:key]; 
        } 
    } 
    
  3. 使用值myInt在您的drawInContext:方法中。現在,當您製作動畫myInt時,Core Animation將爲動畫的每個步驟插值,並重復要求圖層自行繪製。

  4. 如果您還想爲此屬性啓用隱式動畫,還可覆蓋actionForKey:

+0

謝謝!這讓我非常接近我可以品嚐到的解決方案! -drawInContext:使用myInt正確插值多次調用。不幸的是CGContextDrawImage()在動畫運行時不再起作用。我填充的Rects或筆畫都是正確繪製的,但通常由CGContextDrawImage()繪製的圖像會消失,直到動畫結束,就像從不調用CGContextDrawImage()一樣。我很困惑。有什麼想法嗎? – jemmons 2010-03-07 23:52:05

+0

不知道,對不起。我希望你找到一個解決方案。 – 2010-03-08 00:09:05

+3

沒關係。您的回覆仍然是我在Stack Overflow上看到的最好的書面答案之一:) – jemmons 2010-03-08 00:37:49

6

保留您的自定義CALayer的子類的實例變量的方法。您重寫initWithLayer:,該方法被調用來創建自定義圖層的副本。例如,如果您有要在其中創建一個名爲「角度」的自定義屬性層,你可以使用下面的代碼:

@implementation AngledLayer 
@synthesize angle = _angle 

// Tell Core Animation that this key should be animated 
+ (BOOL) needsDisplayForKey:(NSString *)key 
{ 
    if ([key isEqualToString:@"angle"]) return YES; 
    return [super needsDisplayForKey:key]; 
} 


// Make sure that, when the layer is copied, so is the custom ivar 
- (id) initWithLayer:(id)layer 
{ 
    self = [super initWithLayer:layer]; 
    if (self) { 
     AngledLayer *angledVersion = (AngledLayer *)layer; 
     self.angle = angledVersion.angle; 
    } 
    return self; 
} 

而完事大吉!請注意,您不能將此對象與隱式動畫一起使用,您也必須覆蓋actionForKey:方法。

+1

這不適合我。在'initWithLayer'裏面,即使在動畫時,圖層也始終具有屬性的起始值。二傳手被稱爲別的地方。 – zakdances 2013-04-26 11:56:44

+1

我看到和你的朋友一樣。雖然initWithLayer和needsDisplayForkey的組合允許動畫發生,但一旦它結束,圖層就會返回到其初始值。我仍在尋找解決方案。 – 2013-07-29 17:18:18

+0

好吧,看起來我並沒有意識到@dynamic會導致setter自動生成動畫。但如果出於某種原因需要做更多的事情,您可能需要創建自己的具有自己的動畫塊的setter,以便在動畫發生之前更改圖層屬性。見[link](http://stackoverflow.com/questions/11515647/objective-c-cabasicanimation-applying-changes-after-animation) – 2013-07-29 17:31:45