2015-02-05 51 views
0

我正在執行一個定製的拉到刷新組件。零速度的CALayer不會改變它的位置

有微調動畫創建的CALayer,比這層添加到UICollectionView。圖層的速度爲零(self.loaderLayer.speed = 0.0f;),層動畫由timeOffsetscrollViewDidScroll:中管理。問題就在這裏,因爲我也想拉動空間的中心總是顯示加載器,所以我改變層的位置scrollViewDidScroll:這樣的:

[self.loaderLayer setPosition:CGPointMake(CGRectGetMidX(scrollView.bounds), scrollView.contentOffset.y/2)]; 

但沒有與層位置發生(主叫[self.loaderLayer setNeedsDisplay]沒有幫助)。我知道這是因爲零速度。目前,我發現它的工作方式(但我不喜歡):

self.loaderLayer.speed = 1.0f; 
[self.loaderLayer setPosition:CGPointMake(CGRectGetMidX(scrollView.bounds), scrollView.contentOffset.y/2)]; 
self.loaderLayer.speed = 0.0f; 

我怎麼能更改暫停層正確的位置?我錯過了什麼?

+1

設置'speed'到'0.0f'導致*所有動畫*該層被暫停;包括定位。實現你的「微調器動畫暫停」可能與你正在做的不同,但很難說沒有看到你構造你的微調器層的代碼。 – 2015-02-05 16:20:33

+1

只需使用兩個不同的圖層,一個設置爲零速度,另一個設置爲要重新定位。一個可以容納另一個。 – matt 2015-02-05 16:44:00

+0

是的,會包裝第二層。我只是認爲,無論暫停狀態如何,都有強制更新位置的正確方法。謝謝 – 2015-02-05 19:09:09

回答

0

所有問候@David供參考。我只是把它總結爲一個答案。

CoreAnimation處理兩種類型的動畫(交易)的工作原理:明確隱含。當您在財產文檔看Animatable的話,就意味着你每次設置該屬性,CoreAnimation將動畫這個屬性與系統默認時間改變隱含(默認爲1/4秒)。引擎蓋下CALayer已針對這些屬性採取措施,並致電-actionForKey返回此類操作(隱式動畫)。

所以在我的情況下,當我改變一個圖層位置時,CoreAnimation隱含地嘗試動畫這個改變。因爲圖層已暫停(速度爲零)動畫的默認持續時間爲,因此我們沒有看到此視覺變化。

答案是禁用隱式動畫(禁用調用層-actionForKey)。爲此,我們致電[CATransaction setDisableActions:YES]

OR

我們可以標記該動畫立竿見影(通過設置它的持續時間爲零)與調用[CATransaction setAnimationDuration:0.0];

這些標記/更改是基於每個線程的,並且工作於所有事務處理直到下一次運行循環都在特定線程中。因此,如果我們想要將它們應用於具體的交易,我們將代碼編號爲[CATransaction begin]; ... [CATransaction commit];

在我的情況下最終代碼看起來

[CATransaction begin]; 
[CATransaction setDisableActions:YES]; 
[self.loaderLayer setPosition:CGPointMake(CGRectGetMidX(scrollView.bounds), scrollView.contentOffset.y/2)]; 
self.loaderLayer.transform = CATransform3DMakeScale(scaleFactor, scaleFactor, 1); 
[CATransaction commit]; 

它完美的作品!

Loader Demo