MJRefresh實現原理 詳細版

2021-07-13 07:32:04 字數 2072 閱讀 6439

mjrefresh實現原理

大家常用的uitableview  uiclollectionview上拉 下拉載入資料很常見。

以下分析mjrefresh實現方法

首先看下,框架是如何使用的,只需如下2行**即可實現下拉載入資料

self.collectionview.header = [mjrefreshnormalheader

headerwithrefreshingtarget:self

refreshingaction:@selector(loadnewdata)];

[self.collectionview.header

beginrefreshing];

對此肯定很多同學不理解,2行**是怎麼實現的呢,它是怎麼控collectionview

下拉,鬆手後呼叫loadnewdata這個方法呢?

首先請看uitableview  uiclollectionview是繼承自uiscrollview

的,他們是沒有

header

這個屬性的

。(header是自定義的乙個uiview)

要想給即有的類動態增加乙個屬性當然要寫個分類用到執行時了,請看如下**:

.h檔案

@class

mjrefreshheader;

@inte***ce

uiscrollview (mjrefresh)

@property

(strong

,nonatomic

) mjrefreshheader

*header;

@end

.m實現檔案

@implementation

uiscrollview (mjrefresh)

static

const

char

mjrefreshheaderkey =

'\0';

- (void

)setheader:(

mjrefreshheader

*)header

} - (mjrefreshheader

*)header

以上**的作用是給繼承自

uiscrollview的類動態增加了乙個自定義的header屬性

[self

addsubview

:header];這個self其實就是呼叫者本身即self.collectionview

現在就有了乙個自定義的header被加在了self.collectionview上了

但又是如何控制collectionview下拉後,header顯示並呼叫載入資料方法呢?至少得要知道,下拉時

contentoffset.y的偏移量吧,但是怎麼拿到呢。

答案是在header被新增到self.collectionview時,在header這個類中重寫了

- (void

)willmovetosuperview:(

uiview

*)newsuperview//在乙個子檢視將要被新增到另乙個檢視的時候傳送此訊息

這個newsuperview就是self.collectionview,這時只需中header中申明乙個成員變理

__weak

uiscrollview

*_scrollview;/** 

父控制項*/

_scrollview=newsuperview

利用kvo去監聽contentoffset這個值的改變, [

self

.scrollview

addobserver

:self

forkeypath

:@"contentoffset"

options

:options

context

:nil];

下面就是監聽contentoffset值的變化,做相應處理,最後呼叫objc_msgsend(self.refreshingtarget, self.refreshingaction,self);重新整理

原理大概就是這樣,當然實際寫的時候裡面細節有很多,還是很佩服mj老師的^_^。

MJRefresh實現動畫下拉重新整理

專案中需要使用下拉的動畫效果,mj上的是在左,文字在右 而且沒有樣式選擇 我們需要的是在上文字在下,我們只需要繼承mjrefreshgifheader,即可修改樣式。void prepare self setimages idleimages forstate mjrefreshstateidle ...

附近的人實現原理詳細剖析

要實現附近的人這個功能,我們要經歷以下幾個環節 使用者定時上傳自己的定位資訊,並存到服務端的資料庫中 使用者發起查詢請求,服務端根據使用者提供的定位資訊去資料庫中查詢與他的經度緯度海拔最接近的其他使用者的定位資訊。服務端通過兩個定位資訊就能算出距離,按照遠近排好序後,連同對應的使用者賬戶,暱稱,頭像...

ThreadLocal原理詳細解析

threadlocal,可以叫做執行緒本地變數或執行緒本地儲存,顧名思義就是threadlocal為變數在每個執行緒中都建立了乙個副本,那麼每個執行緒可以訪問自己內部的副本變數。其實就是通過空間換時間的方式來取得對每個執行緒各自變數的共享。變數值的共享可以使用 public static 變數的形式...