2011-05-07 85 views
8

我知道一個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無法生成隱式動畫...因此,如何獲取新屬性在之後留下動畫?

+0

對不起,沒有幫助。我能想到的唯一選擇是使用'CALayer'的委託來顯式設置_after_動畫。請參閱[本文](http://stackoverflow.com/questions/2559812/cabasicanimation-not-changing-its-position-property-after-animation-completes)。 – pe8ter 2011-05-08 20:06:32

+0

@ pe8ter:太近了!我遵循這個偉大的建議,但在animationDidStop:截獲動畫並設置框架之前,原始shadowPath有一個非常輕微的閃光。太令人沮喪了。這可能是因爲我必須遍歷一小組視圖控制器來爲每個動畫標識正確的圖層,儘管我懷疑委託方法只是在已經將shadowPath設置爲其原始價值。 – Stuart 2011-05-08 21:59:30

+0

很難說你的代碼出了什麼問題。我嘲笑了一個小測試程序並嘗試了兩種方法;他們按預期工作,沒有任何視覺僞影。 – pe8ter 2011-05-09 01:32:36

回答

7

首先,您沒有設置動畫的fromValue。其次,你是對的:toValue接受CGPathRef,除了它需要被轉換爲id。做這樣的事情:

theAnimation.toValue = (id)[UIBezierPath bezierPathWithRect:newRect].CGPath; 

你還需要,如果你想改變保持動畫後明確設置層的shadowPath財產。

+0

感謝您的回覆。我沒有設置'fromValue',因爲根據文檔它是可選的(我從當前路徑開始動畫)。在壓制編譯器警告的同時強制轉換爲id,仍然沒有解決我的問題。對於明確設置shadowPath屬性以保留動畫後的更改,我們沒有看到任何動畫,所以我認爲這個問題必須存在於別處。 – Stuart 2011-05-08 15:31:35

+0

現在到達 - 不小心將動畫發送到錯誤的圖層。在動畫之後保留shadowPath的新值時遇到了問題 - 我更新了我的問題。 – Stuart 2011-05-08 17:23:38

+1

時間吃一些卑微的餡餅。你第一個建議設置'fromValue'已經解決了我的問題。我必須承認它對我來說似乎有點奇怪,但由於某些原因,顯式聲明'fromValue'爲當前路徑允許動畫在設置屬性時正常進行。我希望文檔對此更清楚。感謝您所有的幫助。 – Stuart 2011-05-09 18:38:52

1
let cornerRadious = 10.0 
     // 
     let shadowPathFrom = UIBezierPath(roundedRect: rect1, cornerRadius: cornerRadious) 
     let shadowPathTo = UIBezierPath(roundedRect: rect2, cornerRadius: cornerRadious) 
     // 
     layer.masksToBounds = false 
     layer.shadowColor = UIColor.yellowColor().CGColor 
     layer.shadowOpacity = 0.6 
     // 
     let shadowAnimation = CABasicAnimation(keyPath: "shadowPath") 
     shadowAnimation.fromValue = shadowPathFrom.CGPath 
     shadowAnimation.toValue = shadowPathTo.CGPath 
     shadowAnimation.duration = 0.4 
     shadowAnimation.autoreverses = true 
     shadowAnimation.removedOnCompletion = true 
     shadowAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) 
     layer.addAnimation(shadowAnimation, forKey: "shadowAnimation")