使用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...