content和刷新控件相关

需要搞清楚的几个概念

  • 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的上面.

上拉刷新

content和刷新控件相关_第1张图片
上拉刷新

滚动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) {
        //刷新操作...
    }
}

下拉刷新

content和刷新控件相关_第2张图片
下拉刷新

因为事先手动添加了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) {
        //刷新操作...
    }
}

你可能感兴趣的:(content和刷新控件相关)