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...