下拉刷新与上拉加载更多

CocoaUI 内置的 ITable 控件, 是一个类似 UITableView 的控件. 基于性能的考虑, 它继承自 UIScrollView 而不是 UITableView. ITable 暴露了 UIScrollView, 当 ITable 的接口不能满足你的需求时, 你可以直接使用 UIScrollView 做自定义开发.

ITable 内置了下拉刷新和上拉加载更多的功能, 默认的样式已经可以满足绝大多数需求. 但你仍然可以定制(CocoaUI 的一个重要特点就是, 当你对其功能不满时, 你可以使用 UIKit 的原生功能和属性, CocoaUI 和 UIKit 是相互配合的关系).

下载的代码就显示了如何给你的应用增加下拉刷新和上拉加载更多的功能:

- (void)initHeaderFooter{
    if(!self.headerRefreshControl){
        IRefreshControl *header = [[IRefreshControl alloc] init];
        self.headerRefreshControl = header;
    }
    if(!self.footerRefreshControl){
        IRefreshControl *footer = [[IRefreshControl alloc] init];
        [footer setStateTextForNone:@"Pull up to load more"
                              maybe:@"Release to load more"
                              begin:@"loading..."];
        [footer.style set:@"top: -40;"];
        self.footerRefreshControl = footer;
    }
}

- (void)onRefresh:(IRefreshControl *)view state:(IRefreshState)state{
    if(state == IRefreshBegin){
        // refresh
        if(view == self.headerRefreshControl){
            [self clear];
            [self loadData:20];
        }
        // load more
        if(view == self.footerRefreshControl){
            [self loadData:33];
        }
        [self reload];
        [self endRefresh:view];
    }
}

第一个函数, 首先定制顶部的下拉刷新控件, 一切使用默认的, 代码只有两行. 接着定制底部的上拉加载更多控件, 功能稍微复杂, 但仍然使用默认的功能, 只不过修改了拉动页面的不同阶段所显示的提示文字. 另外,

[footer.style set:@"top: -40;"];

让底部的刷新控件可以往上偏移 40px, 这样, 底部控件可以保持显示, 而不会自动缩回去消失. 这个用法和你设置 UIEdgeInsets 类似.

第二个函数便是刷新事件的处理函数, 它首先判断事件的类型, 然后判断是下接刷新还是上拉加载更多, 然后执行对应的逻辑.

注意, 加载回数据后, 你要 reload 数据, 并终止刷新控件的转菊花:

[self reload];
[self endRefresh:view];