欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

iOS實現(xiàn)無感知上拉加載更多功能的思路與方法

 更新時間:2021年07月12日 11:20:48   作者:season_zhu  
下拉刷新和上拉加載更多功能是一個應(yīng)用非常廣泛的一個效果,最新項目中就遇到這個功能,這篇文章主要給大家介紹了關(guān)于iOS實現(xiàn)無感知上拉加載更多功能的思路與方法,需要的朋友可以參考下

什么是無感知上拉加載更多

什么是無感知,這個這樣理解:在網(wǎng)絡(luò)情況正常的情況下,用戶對列表進行連續(xù)的上拉時,該列表可以無卡頓不停再見新的數(shù)據(jù)。

如果要體驗話,Web端很多已經(jīng)做到了,比如掘金的首頁,還有比如i掘金iOS的App,列表都是無感知的。

說來慚愧,寫了這久的代碼,還真的沒有認(rèn)真思考這個功能怎么實現(xiàn)。

如何實現(xiàn)無感知上拉加載更多

我在看見這位網(wǎng)友留言的時候,就開始思考了。

在我看來,有下面幾個著手點:

  • 列表滑動時候的是如何知道具體滑動的位置以觸發(fā)接口請求,添加更多數(shù)據(jù)?
  • 從UIScrollView的代理回調(diào)中去找和scrollView的位置(contentOffset)大小(contentSize)關(guān)系密切的回調(diào)。
  • 網(wǎng)絡(luò)上有沒有比較成熟的思路?

順著這條線,我先跑去看了UIScrollViewDelegate的源碼:

public protocol UIScrollViewDelegate : NSObjectProtocol {

    
    @available(iOS 2.0, *)
    optional func scrollViewDidScroll(_ scrollView: UIScrollView) // any offset changes

    @available(iOS 3.2, *)
    optional func scrollViewDidZoom(_ scrollView: UIScrollView) // any zoom scale changes

    .
    .
    .
    .
    .
    .
    /// 代碼很多,這里就不放上來,給大家壓力了。
}

直接上結(jié)論吧:看了一圈,反正沒有和contentSize或者位置相關(guān)的回調(diào)代理。scrollViewDidScroll這個回調(diào)里面雖然可以知道scrollView,但是對于我們需要的信息還不夠具體。

思考:既然UIScrollViewDelegate的代理沒有現(xiàn)成的代理回調(diào),自己使用KVO去監(jiān)聽試試?

網(wǎng)上的思路(一)

就在我思考的同時,我也在網(wǎng)絡(luò)上需求實現(xiàn)這個功能的答案,讓后看到這樣一個思路:

實現(xiàn)方法很簡單,需要用到tableView的一個代理方法,就可輕松實現(xiàn)。- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath就是這個方法,自定義顯示cell。這個方法不太常用。但是這個方法可在每個cell將要第一次出現(xiàn)的時候觸發(fā)。然后我們可設(shè)置當(dāng)前頁面第幾個cell將要出現(xiàn)時,觸發(fā)請求加載更多數(shù)據(jù)。

我看了之后,心想著,多寫一個TableView的代理,總比寫KVO的代碼少,先試試再說,于是代碼擼起:

extension SwiftCoinRankListController: UITableViewDelegate {
    
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        let row = indexPath.row
        let distance = dataSource.count - 25
        print("row: \(row), distance:\(distance)  ")
        if row == distance {
            loadMore()
        }
    }
}

本代碼可以在開源項目中的SwiftCoinRankListController.swift文件查看具體的邏輯,其主要就是通過cell顯示的個數(shù)去提前請求加載數(shù)據(jù),然后我們看看效果:

Gif可能看起來還好,我說我調(diào)試的感受:雖然做到了上拉無感知,但是當(dāng)手滑的速度比較快的時候,到底了新的數(shù)據(jù)沒有回來,就會在底部等一段時間。

雖然功能達到了,但是感受卻不理想,果然還是監(jiān)聽的細(xì)膩程度不夠。

網(wǎng)上的思路(二)

然后在繼續(xù)的搜索中,我看到了另外一個方案:

很多時候我們上拉刷新需要提前加載新數(shù)據(jù),這時候利用MJRefreshAutoFooter的屬性triggerAutomaticallyRefreshPercent就可以實現(xiàn),該屬性triggerAutomaticallyRefreshPercent默認(rèn)值為1,然后改成0的話劃到底部就會自動刷新,改成-1的話,在快劃到底部44px的時候就會自動刷新。

MJRefresh?使用MJRefreshAutoFooter,這個簡單,我直接把基類的footer給替換掉就可以了,本代碼可以在開源項目中的BaseTableViewController.swift文件查看:

/// 設(shè)置尾部刷新控件,更新為無感知加載更多
let footer = MJRefreshAutoFooter()
footer.triggerAutomaticallyRefreshPercent = -1
tableView.mj_footer = footer

再來看看效果:

直接說感受:

代碼改動性少,編寫簡單,達到預(yù)期效果,爽歪歪。比的方案一更絲滑,體驗好。

到此,功能就實現(xiàn),難道就完了?

當(dāng)然,不會,我們?nèi)タ纯丛创a吧。

MJRefresh代碼的追根朔源

首先我們看看MJRefreshAutoFooter.h文件:

這里有個專門的屬性triggerAutomaticallyRefreshPercent去做自動刷新,那么我們?nèi)JRefreshAutoFooter.m中去看看吧:

注意看看喔,這個.m文件有一個- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change方法,并且還調(diào)用了super,從這個方法名中我們可以明顯的得到當(dāng)scrollView的contentOffset變化的時候進行回調(diào)的監(jiān)聽。,我們順藤摸瓜,看看super是什么,會不會有新的發(fā)現(xiàn):

稍微跟著一下源代碼,MJRefreshAutoFooter的繼承關(guān)系如下:

MJRefreshAutoFooter => MJRefreshFooter => MJRefreshComponent

所以這個super的調(diào)用我們就去MJRefreshComponent.m里面去看看吧:

通過上面的截圖我們可以得到下面的一些信息與結(jié)論:

  • MJRefreshComponent是通過KVO去監(jiān)聽scrollView的contentOffset變化,思路上比較一致。
  • 該類并沒有實現(xiàn)其具體方法,而是將其交由其子類去實現(xiàn),這一點通過看MJRefreshComponent.h的注釋可以得到:

  • MJRefreshComponent從本質(zhì)上更像虛基類。

總結(jié)

如果不是網(wǎng)友提出這個問題,我可能都不會太仔細(xì)的去研究這個功能,也許繼續(xù)普普通通的使用一般的上拉加載更多就夠了。

這次的實踐,其實是從思路到尋找方法,最后再到源碼閱讀的。

思路也許不困難,但是真正一點點實現(xiàn)并完善功能,每一步都并不容易,這次我也僅僅是繼續(xù)使用了MJRefresh這個輪子。

到此這篇關(guān)于iOS實現(xiàn)無感知上拉加載更多功能的思路與方法的文章就介紹到這了,更多相關(guān)iOS上拉加載更多內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

參考文章

相關(guān)文章

  • IOS上實現(xiàn)的自定義儀表盤示例

    IOS上實現(xiàn)的自定義儀表盤示例

    本篇文章主要介紹了IOS上實現(xiàn)的自定義儀表盤示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • IOS安裝包比Android容量大的原因

    IOS安裝包比Android容量大的原因

    這篇文章主要介紹了為什么IOS安裝包比Android容量大的原因,如果你是一個IOS或者安卓開發(fā)者,學(xué)習(xí)下相關(guān)知識吧。
    2018-02-02
  • iOS實現(xiàn)垂直滑動條效果

    iOS實現(xiàn)垂直滑動條效果

    這篇文章主要為大家詳細(xì)介紹了iOS實現(xiàn)垂直滑動條效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • IOS實現(xiàn)簡單的進度條功能

    IOS實現(xiàn)簡單的進度條功能

    這篇文章主要介紹了IOS實現(xiàn)簡單的進度條功能的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • 代碼詳解ios鍵盤收起問題

    代碼詳解ios鍵盤收起問題

    本篇文章針對IOS開發(fā)時候的鍵盤收起問題做了詳細(xì)分析和代碼說明,有興趣的朋友參考下吧。
    2018-01-01
  • ios實現(xiàn)簡易隊列

    ios實現(xiàn)簡易隊列

    這篇文章主要為大家詳細(xì)介紹了ios實現(xiàn)簡易隊列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • iOS 縮小打包項目ipa大小的實現(xiàn)方法

    iOS 縮小打包項目ipa大小的實現(xiàn)方法

    下面小編就為大家分享一篇iOS 縮小打包項目ipa大小的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • iOS實現(xiàn)電子簽名

    iOS實現(xiàn)電子簽名

    這篇文章主要為大家詳細(xì)介紹了iOS實現(xiàn)電子簽名,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • iOS Xcode創(chuàng)建文件時自動生成的注釋方法

    iOS Xcode創(chuàng)建文件時自動生成的注釋方法

    下面小編就為大家分享一篇iOS Xcode創(chuàng)建文件時自動生成的注釋方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • iOS中解決Xcode 8控制臺亂碼的方式

    iOS中解決Xcode 8控制臺亂碼的方式

    這篇文章給大家介紹了iOS中解決Xcode 8控制臺亂碼的方式,文中給出了詳細(xì)解決步驟,相信對大家的理解和學(xué)習(xí)很有幫助,有需要的朋友們下面來一起看看吧。
    2016-10-10

最新評論