上下拉刷新

来源:http://www.cnblogs.com/xiaotian666/archive/2016/08/12/5763588.html
-Advertisement-
Play Games

一.上拉刷新 1.為什麼要做上拉刷新? 想要看一些舊的(更多)數據,就需要上拉刷新,載入更多數據 2.上拉刷新永遠都顯示在tableView最底部,用什麼搭建? tableFootView永遠在tableView最底部,可以用它來搭建 3.上拉刷新業務邏輯 3.1當上拉刷新控制項(footView)全 ...


一.上拉刷新 1.為什麼要做上拉刷新?      想要看一些舊的(更多)數據,就需要上拉刷新,載入更多數據   2.上拉刷新永遠都顯示在tableView最底部,用什麼搭建?      tableFootView永遠在tableView最底部,可以用它來搭建   3.上拉刷新業務邏輯      3.1當上拉刷新控制項(footView)全部顯示的時候,載入更多數據      3.2界面搭建           用xib根據自己需要搭建想要的樣式   4.怎麼判斷上拉刷新控制項完全顯示?      4.1完全顯示的條件是: 偏移量 = 內容高度 + 底部TabBar條高度 - 屏幕的高度        4.2通過scrollView的代理方法可以監聽滾動,可以獲得偏移量 - (void)scrollViewDidScroll:(UIScrollView *)scrollView;         4.3 當前偏移量 > = 偏移量的時候,上拉刷新控制項就完全顯示了   5.我們發現滾動條在最上面和最下麵會被擋住一部分      5.1怎麼解決?           設置一下滾動條的額外滾動區域就可以了        5.2怎麼拿到這個屬性?           去tableView頭文件查找 UIEdgeInsets關鍵字,找不到            5.3去tableView的父控制項scrollView中查找           找到 scrollIndicatorInsets屬性,設置一下,發現就搞定了   6.上拉載入數據      6.1伺服器返回的數據都有一個編號ID(自己的理解)         6.2編號ID是遞增的,新的數據存到資料庫,編號ID依次遞增        6.3顯示到界面的數據從上到下,編號ID遞減,也就是,越下麵,數據越早        6.4所以,我們只要拿到最下麵一條數據的編號ID,請求這個編號之前的數據,就能拿到之前的數據了        6.5這個編號ID,伺服器會給我們,我們只需要記錄下來就可以了            6.6需要載入更多數據,只需要請求參數加上這個編號ID就可以了   7.bug:如果我們一直點擊上拉刷新,會發送很多請求,導致數據重覆,怎麼解決?      7.1搞一個BOOL屬性記錄是否在載入更多數據,如果在載入,就不需要重覆發送請求了        7.2這個屬性記錄在哪裡?控制器?           記錄在控制器不太好,   上拉刷新屬於控制項的業務邏輯,最好記錄在控制項內  載入的時候賦值為yes  載入完畢賦值為no           如果記錄在控制器,如果其它地方用到上拉刷新,就需要把控制器也拖過去,耦合性太高            7.3 一開始運行,上拉刷新控制項就會顯示,怎麼導致的?           一開始沒有數據,上拉刷新會顯示在tableView上,就會載入數據            7.4 怎麼解決?            一開始先把footView隱藏,在第一次載入完數據,刷新表格之後,再顯示            7.5 空間從xib載入出來,尺寸不對?           自動拉伸屬性取消掉就可以了   8.根據是否完全顯示,更改上拉刷新xib裡面空間的內容   二.下拉刷新    1.為什麼做下拉刷新?      用戶想要看到最新的數據   2.下拉刷新,控制項添加到哪裡? headerView上?     不能添加到headerView 上,   一般headerView留給廣告位   3.下拉刷新控制項使用什麼?      使用一個view , 設置view的y值為負數,就能顯示在最上面,而且自帶彈簧效果,把這個view添加到tableView上面   4.下拉控制項業務邏輯      4.1 下拉控制項在鬆手的時候,才需要刷新數據      4.2 拖動的時候,判斷是否完全顯示,完全顯示,下拉控制項的文字和箭頭方向       5.下拉控制項完全顯示條件      5.1怎麼判斷下拉控制項 完全顯示?           也是用過偏移量(為負值)  offsetY =  - (導航條高度 + 下拉控制項高度)               因為本來就有一個偏移量為導航條的高度        5.2 通過代理方法獲取當前偏移量              當前偏移量  <= offsetY的時候,就完全顯示    6.怎麼修改下拉控制項的文字和箭頭方向        6.1 在控制項中定義一個BOOL屬性記錄是否完全顯示        6.2 在控制器中(代理方法中)判斷是否完全顯示,完全顯示賦值為yes        6.3 連線拿到要改變得控制項, 重寫BOOL屬性的set方法,在方法中修改文字和箭頭方法        6.4 修改箭頭方法用transform,正常情況設置負的角度(小於180)應該逆時針 ,但我們設置-180,發現為順時針旋轉??           蘋果判斷臨界值,以最小的角度旋轉,我們只需要在180上面加上一個很小的數值就可以了   7.上下拉衝突      7.1當網路比較慢,用戶先上拉刷新,在下拉刷新就會有bug,會造成數據錯亂,怎麼解決?        7.2只需要在上拉刷新載入數據之前,把之前的所有的數據全部清除,始終保存最新的數據        7.3 假設網路比較慢 用戶上拉之後,回來馬上又下拉   原始數據為   51 50 49 48 47           上拉伺服器應該返回數據 46 45 44 43 42           下拉伺服器應該返回數據  53 52 51 50 49           最終伺服器同時返回數據就會變成 53 52 51 50 49  46 45 44 43 42           數據就丟失了兩條        7.4 怎麼解決?           只允許同時發送一條請求            7.5 定義網路管理者對象,懶載入,在發送新的請求的時候,把之前的請求取消       // 取消之前請求     [self.mgr.tasks makeObjectsPerformSelector:@selector(cancel)];   8.什麼時候需要刷新數據       8.1並不是一鬆手就要刷新數據           下拉控制項完全顯示的時候,鬆手才需要載入最新數據        8.2怎麼監聽鬆手?           代理方法:// 停止拖動 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate        8.3正在請求最新數據的時候,不需要再發送請求數據了(一直拖拽下拉控制項)           同樣,在控制項中也搞一個BOOL屬性,記錄是否正在載入數據        8.4刷新最新數據,一次有可能只有一條最新數據,           現有數據  50 49 48 47 46           載入數據  51 50 49 48 47           載入完數據排列  51 50 49 48 47 50 49 48 47 46           這樣會造成數據重覆           因為把數據轉為模型後,遍歷模型,把模型加到數組中,原來數組中就可能有這些模型了            8.5 解決數據重覆           在載入新的數據之前,只需要把之前的數據全部清空就可以了     三.用第三方框架集成上下拉刷新   直接上源代碼
 1 - (void)setupRefreshView
 2 {
 3     // 下拉刷新
 4     // 當鬆手,並且下拉刷新完全顯示的時候,就會觸發下拉刷新
 5     MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
 6 //下拉控制項透明度自動變化(不拉的時候完全透明) 
 7     header.automaticallyChangeAlpha = YES;
 8     self.tableView.mj_header = header;
 9    
10     // 上拉刷新
11     MJRefreshAutoNormalFooter *footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
12     //上拉控制項自動隱藏,沒有數據的時候隱藏
13     footer.automaticallyHidden = YES;
14     self.tableView.mj_footer = footer;
15 }
16  
17 註意:觸發上下拉刷新,控制項會一直存在,需要我們手動隱藏
18  
19 在數據請求成功的時候隱藏
20  // 結束上拉刷新
21         [self.tableView.mj_footer endRefreshing];
22  
23  
24    // 結束下拉刷新
25         [self.tableView.mj_header endRefreshing];

 

       
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1:運行React Native報連接錯誤解決 解決方式: 在終端進入項目文件里,然後執行:(cd Pods/React; npm run start) 2:組件生命周期介紹 創建階段 1、 getDefaultProps 作用於組件類,也就是調用React.createClass()的時候被調用。 ...
  • 1.監聽按鈕點擊 2.判斷是否是點擊的同一個按鈕(記錄上次點擊的按鈕) 3.當重覆點擊相同按鈕時,需要獲取當前按鈕對應控制器刷新界面 3.1 判斷是否重覆點擊按鈕,代碼寫在哪裡? 點擊標題按鈕,屬於精華控制器的事情,所以找到精華控制器.寫在點擊按鈕方法裡面 3.2怎麼拿到按鈕對應的控制器? 通過當前 ...
  • 一、簡介 相信大家用eclipse上的模擬器會覺得很慢很卡,這裡給大家介紹個好東西安卓模擬器genymotion。瞭解更多,可到此網站https://www.genymotion.com/。 二、安裝genymotion 1、註冊genymotion登錄帳號 進入網站https://www.geny ...
  • 一.點擊查看大圖 1.點擊圖片或按鈕(點擊查看大圖按鈕),modal出來一個控制器,顯示大圖片 2.怎麼處理能讓點擊圖片就能查看大圖? 兩種方法:1.給圖片添加點按手勢 2.給圖片所在的view上添加 - (void)touchesEnded:(NSSet<UITouch *> *)touches ...
  • 目前市面上的應用,貌似除了微信和手Q都會比較擔心被用戶或者系統(廠商)殺死問題。本文對 Android 進程拉活進行一個總結。 ...
  • 一.整體佈局 一.整體佈局 1.項目需求 點擊左邊cell,右邊的cell數據更新 2.界面搭建 2.1交給兩個控制器管理比較麻煩,點擊一個控制器需要通知另外一個控制器 2. 2因此交給一個控制器管理比較好 2.3用xib搭建,左右各放一個tableView就可以了 3.開發順序 先做左邊的tabl ...
  • 前言:在上一篇文章中我們講到了AsyncTask的基本使用、AsyncTask的封裝、AsyncTask 的串列/並行線程隊列、自定義線程池、線程池的快速創建方式。 對線程池不瞭解的同學可以先看 Android AsyncTask 深度理解、簡單封裝、任務隊列分析、自定義線程池 1、Executor ...
  • 問題描述:在使用AndroidStudio開發項目時,使用環信重寫了聊天界面後,運行時app就崩掉了,查看日誌報告,提示報錯如下: 根據提示,明顯是配置出現問題,找環信的客服咨詢,他們只說讓我去掉引用的v7包,可是仍然不好使。 解決方案:後來機智如我,查看環信Demo的Activity,是繼承Eas ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...