在CAAnimation中暫停動畫

2021-08-21 18:15:09 字數 3353 閱讀 4297

使用caanimation做動畫時,如果要移除動畫可以使用

-(void)removeanimationforkey:(nsstring *)key;

-(void)removeallanimations;

移除動畫後,根據動畫 fillmode 的設定,檢視會靜止在動畫起點或者終點的位置,並且動畫再次啟動還是從起點開始.

如果想讓它暫停在當前位置,繼續動畫時從當前位置開始繼續動畫,可以根據暫停動畫的時間計算暫停位置,然後繼續動畫時重新製作新的動畫.

//計算當前檢視位置

-(void)resetviewwithposition:(float)position

else

self

.animateview

.frame = rect;

}//暫停動畫

- (void)nx_pauseanimate

_ispause = yes;

[self

.animateview

.layer removeallanimations];

//動畫已經進行的的時間

_animatetime = _animatetime + [[nsdate date] timeintervalsince1970] - _starttime;

//當前的位置

float pauseposition = [_animation positionwithpausetime:_animatetime];

float scap = (self

.isvertical ? cgrectgetheight(self

.animateview

.frame) :cgrectgetwidth(self

.animateview

.frame) )/2.;

[self resetviewwithposition:(pauseposition -scap)];

}//繼續動畫

- (void)nx_resumeanimate

_ispause = no;

//繼續動畫

_starttime = [[nsdate date] timeintervalsince1970];

nsarray * keypatharray = [_animation keypatharraywithpausetime:_animatetime];

cakeyframeanimation * animate = [cakeyframeanimation animationwithkeypath:_animation.keypath];

animate.values = keypatharray;

animate.duration = _animation.duration - _animatetime;

[self

.animateview

.layer addanimation:animate forkey:_animation.keypath];

[self resetviewwithposition:_endposition];

}

上面的方法也可以實現,但是每次都要重新建立動畫,實在不是高明的方法.其實利用caanimation自身的屬性,有更方便的方法.首先了解一下需要使用的這些屬性

全域性時間

coreanimation有乙個全域性時間的概念,稱作馬赫時間(「馬赫」實際上是 ios和mac os系統核心的命名),它可以通過cacurrentmediatime()獲取.它與nsdate 或 cfabsolutetimegetcurrent()不同, 後兩者返回的時鐘時間將會會網路時間同步,而cacurrentmediatime() 是基於內建時鐘的,不會因為外部時間變化而變化,這個方法獲取到的時間,是手機從開機一直到當前所經過的秒數.

為了暫停在正確的位置以及繼續動畫時起點的位置正確,需要使用這個馬赫時間來計算.

每個calayer和caanimation例項都有自己本地時間的概念,是根據父圖層/動畫層級關係中的begintime,timeoffset和speed屬性計算。就和轉換不同圖層之間座標關係一樣,calayer同樣也提供了方法來轉換不同圖層之間的本地時間。

- (cftimeinterval)converttime:(cftimeinterval)t fromlayer:(calayer *)l;

- (cftimeinterval)converttime:(cftimeinterval)t tolayer:(calayer *)l;

利用caanimation的屬性和全域性時間,就可以實現暫停/繼續動畫了.**如下:

//暫停動畫

- (void)nx_pauseanimate

_ispause = yes;

cftimeinterval pausetime = [self

.animateview

.layer converttime:cacurrentmediatime() fromlayer:nil];

// 設定layer的timeoffset, 在繼續操作也會使用到

self

.animateview

.layer

.timeoffset = pausetime;

// local time與parent time的比例為0, 意味著local time暫停了

self

.animateview

.layer

.speed = 0;

}//繼續動畫

- (void)nx_resumeanimate

_ispause = no;

// 時間轉換

cftimeinterval pausetime = self

.animateview

.layer

.timeoffset;

// 計算暫停時間

cftimeinterval timesincepause = cacurrentmediatime() - pausetime;

// 取消

self

.animateview

.layer

.timeoffset = 0;

// local time相對於parent time世界的begintime

self

.animateview

.layer

.begintime = timesincepause;

// 繼續

self

.animateview

.layer

.speed = 1;

}

在 HTA 中暫停指令碼的方法

問 您好,指令碼專家!如何在 hta 中暫停指令碼?tj 答 您好,tj。您知道,從古至今,人們已經花費了巨大的時間和精力來探索生命的意義。指令碼專家卻從未參與其中。為什麼?好吧,先不說懶,我們知道那無關緊要 就算您的確找到了生命的意義,也沒人在乎它。沒人想知道我們存在的理由 相反,他們 同您一樣 ...

如何優雅的在python中暫停死迴圈?

有時候在工作中可能會遇到要一直執行某個功能的程式,這時候死迴圈就派上用途了,python中死迴圈的具體形式大致如下 while true run your code 通常我們結束死迴圈的程式都是使用ctrl c,但是如果不對程式做處理的話,往往程式會以 異常 的方式結束程式,並且更多的時候我們希望程...

C C 中的「暫停」

c 中實現 任意鍵暫停 有時很重要,比如你用的是cb編輯器,不能像vc那樣自己實現程式執行完後暫停,而是跳回到編輯狀態,根本看不到執行結果。我看過很多人都是用 include加上getch 來實現,其實完全不需要的 用vc或bc編輯c 程式,不用像c語言中加入標頭檔案conio.h 然後用getch...