我有一個名爲myInt的NSInteger屬性的CALayer子類MyLayer。我真的很想通過CABasicAnimation來動畫這個屬性,但是看起來CABasicAnimation只能用於所謂的「動畫」屬性(邊界,位置等)。有什麼我可以重寫,使我的自定義myInt屬性動畫?動畫CALayer子類的自定義屬性
回答
是的,這是可能的(只有在最新的核心動畫發佈,但我相信,即iPhone 3.0 +和OS X 10.6+)。
讓你的財產動態,使CA實現存取你:
@dynamic myInt;
告訴層的性質的變化需要重新劃分:
+ (BOOL)needsDisplayForKey:(NSString*)key { if ([key isEqualToString:@"myInt"]) { return YES; } else { return [super needsDisplayForKey:key]; } }
使用值
myInt
在您的drawInContext:
方法中。現在,當您製作動畫myInt
時,Core Animation將爲動畫的每個步驟插值,並重復要求圖層自行繪製。如果您還想爲此屬性啓用隱式動畫,還可覆蓋
actionForKey:
。
謝謝!這讓我非常接近我可以品嚐到的解決方案! -drawInContext:使用myInt正確插值多次調用。不幸的是CGContextDrawImage()在動畫運行時不再起作用。我填充的Rects或筆畫都是正確繪製的,但通常由CGContextDrawImage()繪製的圖像會消失,直到動畫結束,就像從不調用CGContextDrawImage()一樣。我很困惑。有什麼想法嗎? – jemmons 2010-03-07 23:52:05
不知道,對不起。我希望你找到一個解決方案。 – 2010-03-08 00:09:05
沒關係。您的回覆仍然是我在Stack Overflow上看到的最好的書面答案之一:) – jemmons 2010-03-08 00:37:49
有是保留您的自定義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:方法。
這不適合我。在'initWithLayer'裏面,即使在動畫時,圖層也始終具有屬性的起始值。二傳手被稱爲別的地方。 – zakdances 2013-04-26 11:56:44
我看到和你的朋友一樣。雖然initWithLayer和needsDisplayForkey的組合允許動畫發生,但一旦它結束,圖層就會返回到其初始值。我仍在尋找解決方案。 – 2013-07-29 17:18:18
好吧,看起來我並沒有意識到@dynamic會導致setter自動生成動畫。但如果出於某種原因需要做更多的事情,您可能需要創建自己的具有自己的動畫塊的setter,以便在動畫發生之前更改圖層屬性。見[link](http://stackoverflow.com/questions/11515647/objective-c-cabasicanimation-applying-changes-after-animation) – 2013-07-29 17:31:45
- 1. 動畫自定義CALayer屬性
- 2. CALayer自定義屬性動畫與Xamarin
- 3. CALayer子類不動畫屬性更改
- 4. 自定義屬性更改時重繪自定義CALayer子類
- 5. CALayer:更新內置動畫屬性的自定義動畫屬性
- 6. 自定義CALayer動畫
- 7. 更改自定義屬性時動畫CALayer
- 8. 在CALayer中爲自定義屬性設置動畫
- 9. 動畫CALayer的shadowPath屬性
- 10. 如何爲CALayer子類並使用自定義屬性?
- 11. 根據路徑屬性爲CAShapeLayer的子類自定義屬性設置動畫
- 12. CALayer子類重複動畫
- 13. 爲什麼動畫自定義CALayer屬性導致其他屬性在動畫過程中爲零?
- 14. 動畫自定義屬性的值?
- 15. SceneKit中的自定義動畫屬性
- 16. 更改CALayer屬性的動畫時間
- 17. 動畫和自定義屬性
- 18. 創建自定義動畫屬性
- 19. 使用自定義屬性設置視圖的子類的自定義屬性?
- 20. 觀察CALayer動畫屬性更改
- 21. 集合類型自定義屬性的動畫
- 22. 如何將自定義動畫屬性添加到UIImageView的子類?
- 23. 自定義屬性動畫不能禁用動畫
- 24. 子類化CALayer +隱式動畫w/Swift3
- 25. 動態屬性不與自定義類
- 26. 自定義類屬性 - 動態參考
- 27. 自定義動畫類
- 28. 自定義類別屬性
- 29. 如何更換一個CALayer的自定義動畫出現
- 30. 動態/自定義屬性
試着讓這個屬性成爲'float'嗎? – kennytm 2010-03-07 06:23:32