需要搞清楚的几个概念
tableView的内容(content)包含:
cell
tableHeaderView / tableFooterView
sectionHeader/sectionFooter
-
contentSize
- 内容的大小
-
contentOffset
- 内容的偏移量( content的顶部 - frame的顶部 )
-
contentInset
- 内容周围的间距(内边距)
tableView的刷新场景
在tableView进行刷新时,刷新子控件的添加场景一般有:
- 直接将刷新子控件添加到 tableHeaderView / tableFooterView 中.
- header和footer要显示其他内容,所以我们将刷新控件添加到 (tableHeaderView上面) / (tableFooterView下面) 的区域中
示例图片的使用场景为tableView添加在一个有导航栏的tabBarController中,tableView设置了上下内边距(top和Bottom)保证可以展示所有的内容.
当滚动到tableView的底部时,显示出上拉刷新控件,这个控件是添加在tableFooterView中的.
当需要最新数据时,下拉刷新至最顶部,顶部的headerView添加的内容为广告,所以下拉刷新控件是在header的上面.
上拉刷新
滚动tableView至底部时,footer的刷新控件会慢慢显示出来,当着个控件完全显示出来并且继续向上拖动时,此时需需要刷新数据.
怎样在监听滑动的方法中判断何时刷新呢?
在滑动过程中变量为内容的偏移量(contentOffset.y)这个值,根据右图可知,此时刷新控件已经完全显示出来,如果在这个时刻继续上拉,contentOffset.y继续增大,这时就应该进行刷新操作
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGFloat offsetY = self.tableView.contentSize.height + self.tableView.contentInset.bottom - self.tableView.height;
// 当偏移量 >= offsetY时, footer就完全出现, 进入上拉加载数据状态
if (self.tableView.contentOffset.y > offsetY) {
//刷新操作...
}
}
下拉刷新
因为事先手动添加了top这个内边距,所以当tableView加载出来时,看到导航栏下面的是tableHeaderView,然后是一个个的cell.此时下拉刷新控件会显示出来,当这个控件完全显示出来(且松手)的时候,应该进行刷新操作(如图所示).
变量依然为contentOffset.y,注意这个值是tableView内容和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) {
//刷新操作...
}
}