<code>cadisplaylink</code>是一個能讓我們以和螢幕重新整理率相同的頻率将内容畫到螢幕上的定時器。我們在應用中建立一個新的 <code>cadisplaylink</code> 對象,把它添加到一個<code>runloop</code>中,并給它提供一個 <code>target</code> 和<code>selector</code> 在螢幕重新整理的時候調用。
一但 <code>cadisplaylink</code> 以特定的模式注冊到<code>runloop</code>之後,每當螢幕需要重新整理的時候,<code>runloop</code>就會調用<code>cadisplaylink</code>綁定的<code>target</code>上的<code>selector</code>,這時<code>target</code>可以讀到 <code>cadisplaylink</code> 的每次調用的時間戳,用來準備下一幀顯示需要的資料。例如一個視訊應用使用時間戳來計算下一幀要顯示的視訊資料。在ui做動畫的過程中,需要通過時間戳來計算ui對象在動畫的下一幀要更新的大小等等。
在添加進<code>runloop</code>的時候我們應該選用高一些的優先級,來保證動畫的平滑。可以設想一下,我們在動畫的過程中,<code>runloop</code>被添加進來了一個高優先級的任務,那麼,下一次的調用就會被暫停轉而先去執行高優先級的任務,然後在接着執行<code>cadisplaylink</code>的調用,進而造成動畫過程的卡頓,使動畫不流暢。
<code>duration</code>屬性提供了每幀之間的時間,也就是螢幕每次重新整理之間的的時間。我們可以使用這個時間來計算出下一幀要顯示的ui的數值。但是 <code>duration</code>隻是個大概的時間,如果cpu忙于其它計算,就沒法保證以相同的頻率執行螢幕的繪制操作,這樣會跳過幾次調用回調方法的機會。
<code>frameinterval</code>屬性是可讀可寫的<code>nsinteger</code>型值,辨別間隔多少幀調用一次<code>selector</code> 方法,預設值是1,即每幀都調用一次。如果每幀都調用一次的話,對于ios裝置來說那重新整理頻率就是60hz也就是每秒60次,如果将 <code>frameinterval</code> 設為2 那麼就會兩幀調用一次,也就是變成了每秒重新整理30次。
我們通過<code>pause</code>屬性開控制<code>cadisplaylink</code>的運作。當我們想結束一個<code>cadisplaylink</code>的時候,應該調用<code>-(void)invalidate</code>
從<code>runloop</code>中删除并删除之前綁定的 <code>target</code>跟<code>selector</code>
另外<code>cadisplaylink</code> 不能被繼承。
ios裝置的螢幕重新整理頻率是固定的,<code>cadisplaylink</code>在正常情況下會在每次重新整理結束都被調用,精确度相當高。
<code>nstimer</code>的精确度就顯得低了點,比如<code>nstimer</code>的觸發時間到的時候,<code>runloop</code>如果在阻塞狀态,觸發時間就會推遲到下一個<code>runloop</code>周期。并且 <code>nstimer</code>新增了<code>tolerance</code>屬性,讓使用者可以設定可以容忍的觸發的時間的延遲範圍。
<code>cadisplaylink</code>使用場合相對專一,适合做ui的不停重繪,比如自定義動畫引擎或者視訊播放的渲染。<code>nstimer</code>的使用範圍要廣泛的多,各種需要單次或者循環定時處理的任務都可以使用。在ui相關的動畫或者顯示内容使用 <code>cadisplaylink</code>比起用<code>nstimer</code>的好處就是我們不需要在格外關心螢幕的重新整理頻率了,因為它本身就是跟螢幕重新整理同步的。
廢話寫了這麼多 ,下面是代碼
1.定義彈出view
2.在viewcontroller中調用
3.效果圖

連結: http://pan.baidu.com/s/1erybw8i 密碼: 65ft
https://github.com/ywcui/jellyanimation