一.上拉刷新 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];