iOS編寫下拉刷新控件
現(xiàn)在iOS里有很多成熟的下拉刷新控件,比如MJRefresh,SVPullToRefresh
我這里參考了SV的寫法,但是回調(diào)用的是代理,沒(méi)有用block,個(gè)人感覺(jué)用代理更簡(jiǎn)潔一點(diǎn)
下拉刷新的基本原理
在scrollview的上面和下面分別添加一個(gè)view,上面的是下拉的時(shí)候展示下拉動(dòng)畫的headerView,下面的是上拉加載更多的時(shí)候展示動(dòng)畫的footerView
這里的headerView和footerView都是自己添加的,和tableView自己的header,footer不一樣
headerView是添加在scrollView的最上面的,設(shè)置frame的時(shí)候是origin.y是負(fù)數(shù)
當(dāng)下拉達(dá)到條件就觸發(fā)刷新,同時(shí)更改scrollview的contentInsert.top值,以使手指松開(kāi)之后headerView仍然可以露出來(lái)
刷新結(jié)束之后,停止headerView上面的動(dòng)畫,然后把contentInsert的值改回去
footerView是添加在最下方的,frame.origin.y是scrollview的contentSize.height
在上拉到一定程度之后就更改scrollview的contentInsert,使footerView可以露出來(lái),加載結(jié)束之后就改回去
如何寫下拉刷新
寫下拉刷新一般都是給scrollview寫一個(gè)類別,添加一個(gè)新的方法,來(lái)把headerView和footerView添加到scrollview上面
給scrollview聲明一個(gè)headerView類型的屬性(如何給類別添加屬性)
然后給scrollview的contentoffset屬性添加監(jiān)聽(tīng)者,這個(gè)監(jiān)聽(tīng)者就是headerView
這樣,在scrollview滑動(dòng)的時(shí)候,就可以監(jiān)聽(tīng)到滑動(dòng)的情況,并根據(jù)數(shù)據(jù)來(lái)決定是否刷新和時(shí)候改變scrollview.contentInsert.y
然后再寫一個(gè)停止刷新的方法,用來(lái)停止刷新動(dòng)畫和更改scrollview.contentInsert.y
這樣scrollview的擴(kuò)展就寫完了,然后就要寫自定義的headerView
headerView的動(dòng)畫是根據(jù)需要些的,數(shù)據(jù)來(lái)源就是監(jiān)聽(tīng)到的contentoffset
在scrollViewDidScroll方法里來(lái)處理監(jiān)聽(tīng)到的值
這里使用了一個(gè)枚舉類型來(lái)記錄刷新?tīng)顟B(tài),從而控制動(dòng)畫
雖然原理簡(jiǎn)單,但是實(shí)踐起來(lái)遇到了很多困難,有技術(shù)上的,也有邏輯上的,心力交瘁,才搞出來(lái)一個(gè)小
Demo:https://github.com/chebaoGitHub/CBGeneralRefreshView
footerView同理
結(jié)語(yǔ):
寫這個(gè)控件最大的收獲就是加深了對(duì)set get方法的理解,對(duì)scrollview的理解,對(duì)category的理解
但是這里仍然有一個(gè)bug:
在下拉達(dá)到條件,headerView開(kāi)始動(dòng)畫,設(shè)置contentInsert之后,正在回彈的scrollview會(huì)出現(xiàn)抖動(dòng),手指滑的越快抖動(dòng)越厲害,不知道為什么,現(xiàn)在還沒(méi)有解決,希望大家可以有好的解決方法,大家共同學(xué)習(xí)。
相關(guān)文章
iOS開(kāi)發(fā)之手勢(shì)gesture詳解
本篇文章介紹了iOS開(kāi)發(fā)之手勢(shì)gesture,現(xiàn)在分享給大家,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-11-11iOS應(yīng)用開(kāi)發(fā)中UIScrollView滾動(dòng)視圖的基本用法總結(jié)
這篇文章主要介紹了iOS應(yīng)用開(kāi)發(fā)中UIScrollView滾動(dòng)視圖的基本用法總結(jié),作者還介紹了重寫UIScrollView中的hitTest方法來(lái)解決長(zhǎng)按的事件問(wèn)題,需要的朋友可以參考下2016-02-02詳解Swift 利用Opration和OprationQueue來(lái)下載網(wǎng)絡(luò)圖片
這篇文章主要介紹了詳解Swift 利用Opration和OprationQueue來(lái)下載網(wǎng)絡(luò)圖片的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-09-09iOS仿支付寶芝麻信用分?jǐn)?shù)儀表盤動(dòng)畫效果
這篇文章主要為大家詳細(xì)介紹了iOS仿支付寶芝麻信用分?jǐn)?shù)儀表盤動(dòng)畫效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09Objective-C 代碼與Javascript 代碼相互調(diào)用實(shí)例
這篇文章主要介紹了Objective-C 代碼與Javascript 代碼相互調(diào)用實(shí)例的相關(guān)資料,現(xiàn)在的APP 應(yīng)用有時(shí)候會(huì)調(diào)用網(wǎng)頁(yè)上的內(nèi)容,為了增加用戶體驗(yàn),這里寫下個(gè)實(shí)例,需要的朋友可以參考下2016-10-10iOS長(zhǎng)按UIlabel實(shí)現(xiàn)可復(fù)制功能
在我們?nèi)粘5拈_(kāi)發(fā)中經(jīng)常會(huì)遇到一些小需求,比如需要長(zhǎng)按控件來(lái)拷貝控件中得內(nèi)容,所以這篇文章跟大家分享下iOS中長(zhǎng)按UIlabel實(shí)現(xiàn)可復(fù)制功能的方法,有需要的朋友們可以參考借鑒。2016-09-09iOS開(kāi)發(fā)之級(jí)聯(lián)界面(推薦界面)搭建原理
這篇文章主要為大家詳細(xì)介紹了iOS級(jí)聯(lián)界面(推薦界面)搭建原理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08