iOS--UITableView上下拉刷新加载更多

UITableView的上下拉刷新加载更多的功能是非常常用的,网上有一个很出名的开源项目--EGOTableViewPullRefresh,这个项目只有下拉刷新头,而没有上拉加载的尾部。所以自己就在此基础上改了一下,添加了一个上拉加载的尾部。

本文的Demo在 https://github.com/gaussli/PullUpDownRefreshTableViewDemo

下面来说一下大致思想和说明:

1. 先对两个主要的类进行说明:

1)JHPullRefreshHeaderView:下拉刷新头

按照上面上述EGOTableViewPullRefresh项目中的思想,我也分了三个状态,普通状态JHPullRefreshHeaderNormal;下拉过程状态JHPullRefreshHeaderPulling,正在加载状态JHPullRefreshHeaderLoading。

下拉刷新代理JHPullRefreshHeaderDelegate,用于在下拉刷新头进入正在加载状态时外部实现数据加载操作。

- (void) firstAutoLoadingWithScrollView: (UIScrollView*)scrollView;--首次自动刷新逻辑

- (void) refreshScrollViewDidScroll:(UIScrollView *)scrollView;--滚动过程逻辑

- (void) refreshScrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;--松开触碰逻辑

- (void) refreshScrollViewDataSourceDidFinishedLoading:(UIScrollView *)scrollView;--加载数据成功逻辑

2)JHPullRefreshFooterView:上拉加载尾

其实这个就和下拉刷新头的思想一样了。

2. 使用步骤:

1)在ViewController中声明一个普通的UITableView对象,并进行必要的初始化操作:

声明:

    @property (nonatomic, strong) UITableView *tableview;                                       // TableView
    @property (nonatomic, strong) JHPullRefreshHeaderView *pullRefreshHeaderView;               // 下拉刷新头
    @property (nonatomic, strong) JHPullRefreshFooterView *pullRefreshFooterView;               // 上拉加载尾

初始化

    self.tableview = [[UITableView alloc] initWithFrame:CGRectMake(0, 20, JH_DEVICE_WIDTH, JH_DEVICE_HEIGHT-JH_STATUSBAR_HEIGHT)];
    self.tableview.dataSource = self;
    self.tableview.delegate = self;
    // 去除多余的横线
    self.tableview.tableFooterView = [[UIView alloc] init];
    [self.view addSubview:self.tableview];
2)实现必要的代理:

系统代理:UITableViewDataSource, UITableViewDelegate(在使用上拉刷新下拉加载时需要使用到UIScrollViewDelegate代理,这里不用实现的原因是UITableViewDelegate里已经包含了)

自定义代理(就是下拉刷新和上拉加载的代理):JHPullRefreshHeaderDelegate, JHPullRefreshFooterDelegate

3)添加下拉刷新头:

声明:

    @property (nonatomic, strong) JHPullRefreshHeaderView *pullRefreshHeaderView;               // 下拉刷新头
初始化:

    // 设置下拉刷新头
    self.pullRefreshHeaderView = [[JHPullRefreshHeaderView alloc] initWithFrame:CGRectMake(0, -40, self.tableview.frame.size.width, 40)];
    self.pullRefreshHeaderView.delegate = self;
    [self.tableview addSubview:self.pullRefreshHeaderView];

4)设置下拉刷新头的操作

a)实现UIScrollViewDelegate中的- (void) scrollViewDidScroll:(UIScrollView *)scrollView,添加代码:

    [self.pullRefreshHeaderView refreshScrollViewDidScroll:scrollView];
b)实现UIScrollViewDelegate中的- (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate,添加代码:

    [self.pullRefreshHeaderView refreshScrollViewDidEndDragging:scrollView willDecelerate:decelerate];
c)实现JHPullRefreshHeaderView代理的函数(第二个函数是Demo使用的,实际情况应该是数据加载逻辑):

    #pragma mark 下拉刷新代理
    - (void) pullRefreshHeaderWithScrollView:(UIScrollView *)scrollView {
        [self performSelector:@selector(refreshScrollHeaderViewDataSourceDidFinishedLoading) withObject:nil afterDelay:1.5];
    }
    #pragma mark 下拉刷新数据获取成功
    - (void) refreshScrollHeaderViewDataSourceDidFinishedLoading {
        [self.pullRefreshHeaderView refreshScrollViewDataSourceDidFinishedLoading:self.tableview];
    }
5)添加上拉加载头

声明:

    @property (nonatomic, strong) JHPullRefreshFooterView *pullRefreshFooterView;               // 上拉加载尾

初始化,尾部的初始化和头部不一样,头部只要放在tableView之上就可以了,但是尾部要放到最后面,就要知道tableView的contentSize是多少,于是我是在这个tableView初始化后在添加尾部的,而且如果tableView中的数据没有占满tableView的空间,就说明它的数据还不是太多,就没有必要把上拉加载添加进去了。所以这里有一个判断,判断tableView的contentSize.y是否大于frame.size.height,如果大于,则添加尾部,否则不添加:

    if (self.tableview.contentSize.height >= self.tableview.frame.size.height) {
        // 设置上拉加载尾
        self.pullRefreshFooterView = [[JHPullRefreshFooterView alloc] initWithFrame:CGRectMake(0, self.tableview.contentSize.height, self.tableview.frame.size.width, 40)];
        self.pullRefreshFooterView.delegate = self;
        [self.tableview addSubview:self.pullRefreshFooterView];
    }
6)设置上拉加载尾的操作,这个操作就和下拉刷新操作基本类似了,在实际中应该就只是数据加载的操作不一样而已了,这里就不多写。


至此,一个比较简单的下拉刷新上拉加载的功能就完成了,以此记录,慢慢进步。








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值