需要搞清楚的幾個概念
tableView的內(nèi)容(content)包含:
cell
tableHeaderView / tableFooterView
sectionHeader/sectionFooter
-
contentSize
- 內(nèi)容的大小
-
contentOffset
- 內(nèi)容的偏移量( content的頂部 - frame的頂部 )
-
contentInset
- 內(nèi)容周圍的間距(內(nèi)邊距)
tableView的刷新場景
在tableView進行刷新時,刷新子控件的添加場景一般有:
- 直接將刷新子控件添加到 tableHeaderView / tableFooterView 中.
- header和footer要顯示其他內(nèi)容,所以我們將刷新控件添加到 (tableHeaderView上面) / (tableFooterView下面) 的區(qū)域中
示例圖片的使用場景為tableView添加在一個有導航欄的tabBarController中,tableView設置了上下內(nèi)邊距(top和Bottom)保證可以展示所有的內(nèi)容.
當滾動到tableView的底部時,顯示出上拉刷新控件,這個控件是添加在tableFooterView中的.
當需要最新數(shù)據(jù)時,下拉刷新至最頂部,頂部的headerView添加的內(nèi)容為廣告,所以下拉刷新控件是在header的上面.
上拉刷新
滾動tableView至底部時,footer的刷新控件會慢慢顯示出來,當著個控件完全顯示出來并且繼續(xù)向上拖動時,此時需需要刷新數(shù)據(jù).
怎樣在監(jiān)聽滑動的方法中判斷何時刷新呢?
在滑動過程中變量為內(nèi)容的偏移量(contentOffset.y)這個值,根據(jù)右圖可知,此時刷新控件已經(jīng)完全顯示出來,如果在這個時刻繼續(xù)上拉,contentOffset.y繼續(xù)增大,這時就應該進行刷新操作
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGFloat offsetY = self.tableView.contentSize.height + self.tableView.contentInset.bottom - self.tableView.height;
// 當偏移量 >= offsetY時, footer就完全出現(xiàn), 進入上拉加載數(shù)據(jù)狀態(tài)
if (self.tableView.contentOffset.y > offsetY) {
//刷新操作...
}
}
下拉刷新
因為事先手動添加了top這個內(nèi)邊距,所以當tableView加載出來時,看到導航欄下面的是tableHeaderView,然后是一個個的cell.此時下拉刷新控件會顯示出來,當這個控件完全顯示出來(且松手)的時候,應該進行刷新操作(如圖所示).
變量依然為contentOffset.y,注意這個值是tableView內(nèi)容和frame的差值.
如圖所示,此時的contentOffset.y應該和(tableView.contentInset.y + 刷新子控件.height)作比較.
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
CGFloat offsetY = -(self.tableView.contentInset.top + self.header.height);
if (self.tableView.contentOffset.y <= offsetY) {
//刷新操作...
}
}