MJRefresh 原始碼解讀 使用

2022-07-07 11:09:12 字數 3066 閱讀 8139

mjrefresh這個重新整理控制項是一款非常好用的框架,我們在使用乙個框架的同時,最好能了解下它的實現原理,不管是根據業務要求在原有的基礎上修改**,還是其他的目的,弄明白作者的思路和**風格,會受益匪淺。

隨著開發經驗的不斷積累,個人的能力也會不斷提高。每個人的進步都會有乙個過程,這個過程就好比登山。乙個框架對我們的意義從開始的簡單實用,慢慢的就會過渡到了解,最終讓它成為你大腦的一部分。這篇文章不會對**進行逐行解讀,最重要的目的是讓朋友們明白mjrefresh是怎麼做到重新整理的,我們還能如何擴充套件它的功能。

我們在mjrefresh的 mjrefresh github 上拿到了下邊這張圖:

正如這張所說的,所有的功能的實現都基於mjrefreshcomponent這個重新整理元件。mjrefreshcomponent有兩個分支mjrefreshheader(給了下拉重新整理的能力)mjrefreshfooter(給了上拉重新整理的能力)。

在進行下邊的**分析之前,我們來看看重新整理的整個過程(我們以頭部重新整理為例):

看這張上的**,能夠tableview.mj_header這樣使用,說明tableview有mj_header這個屬性。然後我們看一下uiscrollview+mjrefresh這個檔案。原理是給這個scrollview新增了乙個控制項,**如下

我看了下mjrefreshheader的這個檔案的標頭檔案,對我們理解原理並沒有幫助,由於它是繼承mjrefreshcomponent的,所以我們開啟mjrefreshcomponent的標頭檔案來看。

這幾個狀態非常關鍵,是使用整個框架的核心思路。為什麼這麼說?如果我們在滑動的過程中,狀態也會改變,那麼必然會呼叫狀態的setter方法,我們就利用這個方法,顯示自己想要的效果。

到這裡基本上就很明白了。由於mjrefreshcomponent是乙個uiview,因此我們可以隨意往上新增控制項,我們在prepare中新增控制項,在placesubviews中布局,通過scrollviewcontentoffsetdidchange:方法指導contentoffset改變了。然後就能自定義事件了。

最終我們在我們最需要的狀態上繫結事件就ok了。

mjrefreshcomponent 這個類是最最基礎能力的搭建了。除了暴露出業務介面外。值得注意的有兩點:

上邊uiscrollview+mjrefresh中提到把mj_header這個view加到了scrollview上,那麼mjrefreshcomponent是如何獲取scrollview的呢?

如何監聽我們需要的變化?比如說contentoffset。。。

示例**:

- (void)willmovetosuperview:(uiview *)newsuperview

}

當乙個控價被新增到另乙個控制項上的時候,就會呼叫這個方法,這這個方法中我們就獲取到了scrollview,並且設定了監聽事件,監聽事件這裡就不寫了。

mjrefreshheader 這個類提供了重新整理的核心功能,這個類並沒有像uiimageview,uilabel這樣的控制項。所以說他同樣是乙個基礎類,我們使用中只需繼承這個類,新增需要的ui控制項就行了。

示例**:

- (void)scrollviewcontentoffsetdidchange:(nsdictionary *)change

// 跳轉到下乙個控制器時,contentinset可能會變

_scrollvieworiginalinset = self.scrollview.contentinset;

// 當前的contentoffset

cgfloat offsety = self.scrollview.mj_offsety;

// 頭部控制項剛好出現的offsety

// 如果是向上滾動到看不見頭部控制項,直接返回

// >= -> >

// 普通 和 即將重新整理 的臨界點

if (self.scrollview.isdragging) else if (self.state == mjrefreshstatepulling && offsety >= normal2pullingoffsety)

} else if (self.state == mjrefreshstatepulling) else if (pullingpercent < 1)

}

這個是通過contentoffset計算狀態的核心方法。由於**注釋很詳細,就不做解釋了,只要一行一行理解就能行了。

mjrefreshautofooter 提供了當滑到底部時,自動載入的功能,我們來看看**:

有時間寫乙個類似知乎重新整理那樣的效果。

openTLD 原始碼解讀

首先是run tld 在其次就是tldexample 最後到了初始化函式tldinit 第乙個比較關鍵的函式 bb scan 將影象網格化,將首先 scale 1.2.10 10 21 個規格 在每個規格上打網格 這個函式有乙個比較重要的方法 ntuples 就是重複 因為網格上的點很多點有相同的x...

thinkphp原始碼解讀

thinkphp原始碼解讀 thinkphp原始碼的根目錄下是 index.php,是系統預設的 主頁,index.php中首先檢測的是 php執行環境,如果php版本小於 5.3.0則退出執行,定義是否為除錯模式,定義應用目錄,引入入口檔案。thinkphp是整個框架的入口檔案,在thinkphp...

HashMap原始碼解讀

一 建立乙個hashmap都做了哪些工作?mapmap new hashmap hahmap無參構造方法 public hashmap 可以看到設定了載入因子 預設0.75 閾值 預設容量16 預設載入因子0.75 12 table是hashmap內部資料儲存結構entry陣列。當hashmap的s...