掃描二維碼成功時(shí)要暫停掃描動(dòng)畫,給用戶掃描成功的感覺堤瘤。實(shí)現(xiàn)代碼比較簡(jiǎn)單本辐。
OC代碼
- (void)animationStart {
// 掃描動(dòng)畫
[UIView animateWithDuration:5 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
self.lineImageView.frame = CGRectMake(0, 220, 220, 2);
} completion:^(BOOL finished) {
}];
}
- (void)animationPause {
// 當(dāng)前時(shí)間(暫停時(shí)的時(shí)間)
// CACurrentMediaTime() 是基于內(nèi)建時(shí)鐘的,能夠更精確更原子化地測(cè)量环葵,并且不會(huì)因?yàn)橥獠繒r(shí)間變化而變化(例如時(shí)區(qū)變化宝冕、夏時(shí)制邓萨、秒突變等),但它和系統(tǒng)的uptime有關(guān),系統(tǒng)重啟后CACurrentMediaTime()會(huì)被重置
CFTimeInterval pauseTime = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil];
// 停止動(dòng)畫
self.layer.speed = 0;
// 動(dòng)畫的位置(動(dòng)畫進(jìn)行到當(dāng)前時(shí)間所在的位置,如timeOffset=1表示動(dòng)畫進(jìn)行1秒時(shí)的位置)
self.layer.timeOffset = pauseTime;
}
- (void)animationContinue {
// 動(dòng)畫的暫停時(shí)間
CFTimeInterval pausedTime = self.layer.timeOffset;
// 動(dòng)畫初始化
self.layer.speed = 1;
self.layer.timeOffset = 0;
self.layer.beginTime = 0;
// 程序到這里宝剖,動(dòng)畫就能繼續(xù)進(jìn)行了歉甚,但不是連貫的,而是動(dòng)畫在背后默默“偷跑”的位置赖钞,如果超過一個(gè)動(dòng)畫周期,則是初始位置
// 當(dāng)前時(shí)間(恢復(fù)時(shí)的時(shí)間)
CFTimeInterval continueTime = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil];
// 暫停到恢復(fù)之間的空檔
CFTimeInterval timePause = continueTime - pausedTime;
// 動(dòng)畫從timePause的位置從動(dòng)畫頭開始
self.layer.beginTime = timePause;
}
相關(guān)資料
關(guān)于duration弓千、beginTime和timeOffset這些時(shí)間相關(guān)的屬性献起,可以參考博客《控制動(dòng)畫時(shí)間》谴餐。
簡(jiǎn)單來說,duration是動(dòng)畫持續(xù)的時(shí)間岂嗓;beginTime是動(dòng)畫延遲執(zhí)行的時(shí)間,如果想延遲1s執(zhí)行善镰,就設(shè)置為CACurrentMediaTime()+1年枕;timeOffset是動(dòng)畫執(zhí)行偏移炫欺,timeOffset=1表示動(dòng)畫從動(dòng)畫執(zhí)行1s時(shí)的狀態(tài)開始,如簡(jiǎn)單的位移動(dòng)畫熏兄,1s時(shí)移動(dòng)到一半的位置品洛,設(shè)置timeOffset=1時(shí)動(dòng)畫從一半的位置開始執(zhí)行,到一半的位置結(jié)束摩桶,完成一個(gè)周期的動(dòng)畫桥状。