我知道一個CALayer的shadowPath只能使用顯式動畫進行動畫製作,但是我仍然無法讓它工作。我懷疑我沒有正確通過toValue
- 據我所知這必須是id
,但該屬性需要CGPathRef。將其存儲在UIBezierPath
似乎不起作用。我使用下面的代碼進行測試:動畫CALayer的shadowPath屬性
CABasicAnimation *theAnimation = [CABasicAnimation animationWithKeyPath:@"shadowPath"];
theAnimation.duration = 3.0;
theAnimation.toValue = [UIBezierPath bezierPathWithRect:CGRectMake(-10.0, -10.0, 50.0, 50.0)];
[self.view.layer addAnimation:theAnimation forKey:@"animateShadowPath"];
(我使用負值,以確保陰影延伸超過位於其頂部視圖...層的masksToBounds
屬性設置爲NO
) 。
shadowPath的動畫是如何實現的?
UPDATE
問題近解決。不幸的是,主要的問題是一個粗心的錯誤...
我犯的錯誤是將動畫添加到視圖控制器的根層,而不是我專用於陰影的圖層。另外,@ pe8ter是正確的,因爲toValue
需要是CGPathRef
轉換爲id
(很明顯,當我之前嘗試過,因爲錯誤的層錯誤,我還沒有動畫)。該動畫作品用下面的代碼:
CABasicAnimation *theAnimation = [CABasicAnimation animationWithKeyPath:@"shadowPath"];
theAnimation.duration = 3.0;
theAnimation.toValue = (id)[UIBezierPath bezierPathWithRect:myRect].CGPath;
[controller.shadowLayer addAnimation:theAnimation forKey:@"shadowPath"];
我明白,這是很難從我提供的示例代碼被發現。但希望它仍然可以用於類似情況的人們。
然而,當我嘗試並添加行
controller.shadowLayer.shadowPath = [UIBezierPath bezierPathWithRect:myRect].CGPath;
動畫停止工作,和陰影只是跳轉到最終位置瞬間。 Docs說要使用與要更改的屬性相同的鍵添加動畫,以覆蓋在設置屬性值時創建的隱式動畫,但shadowPath無法生成隱式動畫...因此,如何獲取新屬性在之後留下動畫?
對不起,沒有幫助。我能想到的唯一選擇是使用'CALayer'的委託來顯式設置_after_動畫。請參閱[本文](http://stackoverflow.com/questions/2559812/cabasicanimation-not-changing-its-position-property-after-animation-completes)。 – pe8ter 2011-05-08 20:06:32
@ pe8ter:太近了!我遵循這個偉大的建議,但在animationDidStop:截獲動畫並設置框架之前,原始shadowPath有一個非常輕微的閃光。太令人沮喪了。這可能是因爲我必須遍歷一小組視圖控制器來爲每個動畫標識正確的圖層,儘管我懷疑委託方法只是在已經將shadowPath設置爲其原始價值。 – Stuart 2011-05-08 21:59:30
很難說你的代碼出了什麼問題。我嘲笑了一個小測試程序並嘗試了兩種方法;他們按預期工作,沒有任何視覺僞影。 – pe8ter 2011-05-09 01:32:36