天天看點

實作自定義延遲加載的滾動視圖

資料量大,單個資料處理耗時的情況下,一個延遲加載的自定義視圖就必不可少了。我們希望這樣的視圖可以

在需要用到某個資料源的時候再去裝載這個資料并處理之。而不是視圖已啟動就把全部的資料都加載上去。如果

全部加載再加上伺服器請求(如果有的話)的時間絕對超過使用者忍耐的極限。随之應用必然遭棄!

uitableview也有一定的複用機制。大概的機理是:每次到一個cell出現在可視區域的時候,它會從已經用過的cell中

取出來一個, 如果還沒有用過的cell(也就是說這個傳回值是空)就建立一個。當一個cell劃出可視範圍的時候就把這個

cell放到備用數組中供以後使用。如下代碼中就有所展現:

實作自定義延遲加載的滾動視圖
實作自定義延遲加載的滾動視圖

這裡沒有的就是回收不在顯示範圍的cell的步驟,其代碼應該是這樣的:

實作自定義延遲加載的滾動視圖
實作自定義延遲加載的滾動視圖

dequeuereusablecellwithidentifier這個方法都做了些神馬呢,這裡有一個模拟:

實作自定義延遲加載的滾動視圖
實作自定義延遲加載的滾動視圖

從中可以看出。uitableview的複用機制包括兩個數組:一個存放顯示區域中的cell,一個存放不在顯示區域中的cell。

當然uitableview實際的服用機制要比這個複雜。比如我們沒有提到的cellidentifier。這個與本文的中心有所偏離,各位可以自行研究。

uitableview雖然好用,但是不能滿足所有的需求。是以很多人內建uiscrollview實作滾動視圖。但是機制都和uitableview差不多。

實作出來的效果也是手指快速從螢幕上劃過,一堆的cell一樣的視圖轱辘個沒完。

那麼如何能夠一次滑動隻滾動一個“cell”,或者說是翻一頁。而且同時加載這一頁對應的資料呢?

各位應該都看過雜技的一個最簡單的節目,幾個球在空中扔來扔去的。這個可以簡單到隻用兩個視圖交替展示一個舊的和一個新的視圖,

從一個方向依次滾動,然後複位,裝填一舊一新的資料,然後再滾動,再複位。在使用者的眼前看到的可以是一個無窮循環播放的視圖。

在這個視圖初始化的時候:

實作自定義延遲加載的滾動視圖
實作自定義延遲加載的滾動視圖

uipangesturerecognizer是必須的,沒有這個的話無法撲捉使用者的手勢操作。整個視圖的結構是一個視圖在最下面撲捉使用者手勢并作為其他附屬視圖的container。

另外還有兩個輪換的子視圖響應使用者操作。

當使用者操作的時候如此處理:

實作自定義延遲加載的滾動視圖
實作自定義延遲加載的滾動視圖

當使用者手指在螢幕上作出pan手勢,并且移動距離達到觸發視圖行為的時候動畫移動左視圖出可視區域,同時右視圖随着左視圖移入可視區域。

之後交換左右視圖指針值,然後清空右視圖的全部子視圖。

滾動視圖和其superview通過一個block互動。

這個block會把目前滾動視圖的左視圖、右視圖、移動方向和目前需要用到的資料index一起發送給superview。superview可以根據這些

參數加載所需的視圖并把處理之後的資料按照需要的方式展現在滾動視圖中。

調用滾動視圖的代碼:

實作自定義延遲加載的滾動視圖
實作自定義延遲加載的滾動視圖

調用滾動視圖代碼:

實作自定義延遲加載的滾動視圖
實作自定義延遲加載的滾動視圖

是指移動方向枚舉:

枚舉中第三項startpoint是說在視圖第一次在superview中加載上來的時候的狀态。

同時開發這個滾動視圖時還需要考慮的到如果到了資料源的最後一項如何處理。在這裡使用者手指向右滑動的時候跳轉到上一層controller。

先寫到這裡了。謝謝 :)

歡迎加群互相學習,共同進步。qq群:ios: 58099570 | android: 330987132 | go:217696290 | python:336880185 | 做人要厚道,轉載請注明出處!http://www.cnblogs.com/sunshine-anycall/p/3257399.html