您好,登錄后才能下訂單哦!
這篇文章主要講解了“NSTimer怎樣實(shí)現(xiàn)彈性球動(dòng)畫”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“NSTimer怎樣實(shí)現(xiàn)彈性球動(dòng)畫”吧!
NSTimer并不是最佳方案,為了理解這點(diǎn),我們需要確切地知道NSTimer是如何工作的。iOS上的每個(gè)線程都管理了一個(gè)NSRunloop,字面上看就是通過一個(gè)循環(huán)來完成一些任務(wù)列表。但是對(duì)主線程,這些任務(wù)包含如下幾項(xiàng):
處理觸摸事件
發(fā)送和接受網(wǎng)絡(luò)數(shù)據(jù)包
執(zhí)行使用gcd的代碼
處理計(jì)時(shí)器行為
屏幕重繪
當(dāng)你設(shè)置一個(gè)NSTimer,他會(huì)被插入到當(dāng)前任務(wù)列表中,然后直到指定時(shí)間過去之后才會(huì)被執(zhí)行。但是何時(shí)啟動(dòng)定時(shí)器并沒有一個(gè)時(shí)間上限,而且它只會(huì)在列表中上一個(gè)任務(wù)完成之后開始執(zhí)行。這通常會(huì)導(dǎo)致有幾毫秒的延遲,但是如果上一個(gè)任務(wù)過了很久才完成就會(huì)導(dǎo)致延遲很長一段時(shí)間。
屏幕重繪的頻率是一秒鐘六十次,但是和定時(shí)器行為一樣,如果列表中上一個(gè)執(zhí)行了很長時(shí)間,它也會(huì)延遲。這些延遲都是一個(gè)隨機(jī)值,于是就不能保證定時(shí)器精準(zhǔn)地一秒鐘執(zhí)行六十次。有時(shí)候發(fā)生在屏幕重繪之后,這就會(huì)使得更新屏幕會(huì)有個(gè)延遲,看起來就是動(dòng)畫卡殼了。有時(shí)候定時(shí)器會(huì)在屏幕更新的時(shí)候執(zhí)行兩次,于是動(dòng)畫看起來就跳動(dòng)了。
我們可以通過一些途徑來優(yōu)化:
我們可以用CADisplayLink讓更新頻率嚴(yán)格控制在每次屏幕刷新之后。
基于真實(shí)幀的持續(xù)時(shí)間而不是假設(shè)的更新頻率來做動(dòng)畫。
調(diào)整動(dòng)畫計(jì)時(shí)器的runloop模式,這樣就不會(huì)被別的事件干擾。
CADisplayLink是CoreAnimation提供的另一個(gè)類似于NSTimer的類,它總是在屏幕完成一次更新之前啟動(dòng),它的接口設(shè)計(jì)的和NSTimer很類似,所以它實(shí)際上就是一個(gè)內(nèi)置實(shí)現(xiàn)的替代,但是和timeInterval以秒為單位不同,CADisplayLink有一個(gè)整型的frameInterval屬性,指定了間隔多少幀之后才執(zhí)行。默認(rèn)值是1,意味著每次屏幕更新之前都會(huì)執(zhí)行一次。但是如果動(dòng)畫的代碼執(zhí)行起來超過了六十分之一秒,你可以指定frameInterval為2,就是說動(dòng)畫每隔一幀執(zhí)行一次(一秒鐘30幀)或者3,也就是一秒鐘20次,等等。
感謝各位的閱讀,以上就是“NSTimer怎樣實(shí)現(xiàn)彈性球動(dòng)畫”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)NSTimer怎樣實(shí)現(xiàn)彈性球動(dòng)畫這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。