转载:http://blog.csdn.net/kmyhy/article/details/7522299
大名鼎鼎的egoTableViewPullRefresh想必大家都听说过。它是一个下拉刷新表格控件。当你将TableView向下拉到一定位置,表视图单元格将自动刷新数据。但是这次我们想介绍的不是egoTableViewPullRefresh,我们将介绍一个自己实现的RefreshBar控件,这个控件可以用在普通的TableView中,使我们能够在UITableView上实现上拉刷新的功能。因为我一直觉得上拉刷新要比下拉刷新的用户体验要好。因为人的阅读习惯是从上往下的,而你滚动表格时,也是“上拉”的动作,当你拉到当前表格的最后一行时,你刚好可以看到RefreshBar控件显示出来,此时只需要再次上拉(而不需要象“下拉”刷新一样要回到表格头部)就可加载更多行。
这是RefreshBar的项目地址:
https://github.com/kmyhy/RefreshBar
一、RefreshBar的特性
RefreshBar是一个“上拉刷新”手势识别的组件。可以将RefreshBar用于你的UITableView上。它具有以下功能:
1、“上拉”时提示
2、继续上拉,识别为“刷新”手势
3、释放手指,开始刷新。在刷新过程中,动画被禁止
4、刷新完毕,显示刷新日期。无数据进行提示
二、将RefreshBar加到项目中
你下载解压后,可以看到两个目录:RefreshBar和ProgressiveRefreshTableApp。分别对应RefreshBar的源文件目录和它的demo项目,你可以直接运行demo,学习如何使用RefreshBar。这是完全开源和免费的,如果你要在自己的项目中使用它,把RefreshBar目录整个复制到你的项目中即可,包括以下5个文件:
§ RefreshBar.xib
§ RefreshBar.m
§ RefreshBar.h
§ grayArrow.png
§ whiteArrow.png
二、初始化
如果要在你的View Controller中使用RefreshBar,你需要在viewDidLoad中初始化它,并将它添加到UITableView的下方:
_refreshBar=[[RefreshBaralloc]init];
[_refreshBarsetFrame:CGRectMake(0.0f,
0.0f + self.tableView.frame.size.height,
self.view.frame.size.width,
_refreshBar.frame.size.height)];
[self.tableViewaddSubview:_refreshBar];
三、实现委托
要让RefreshBar能正常工作,你必需在初始化它后设置它的delegate属性:
_refreshBar.delegate=self;
委托对象(即View Controller)总共需要实现两个委托协议:
RefreshBarDelegate,UIScrollViewDelegate
其中,UIScrollViewDelegate协议方法的实现最为简单,它们都调用了RefreshBar的方法:
#pragma mark -ScrollView delegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
[_refreshBarscrollViewDidScroll:scrollView];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollViewwillDecelerate:(BOOL)decelerate{
[_refreshBarscrollViewDidEndDragging:scrollView];
}
然后是RefreshBarDelegate协议。这个协议定义了4个方法,都是必需实现的:
-(void)beginDataSourceLoading:(RefreshBar*)refreshBar;
-(BOOL)hasMoreData;
-(BOOL)isDataSourceLoading;
-(void)endDataSourceLoading:(RefreshBar*)refreshBar;
beginDataSourceLoading:方法在RefreshBar感知到一个有效的“上拉刷新”手势时调用,这个方法中,你应该加载新的行数据。
如果这个过程是耗时的,你还应该设置一些标记(标识过程是否结束)。
在过程结束时,应该手动调用RefreshBar的dataSourceDidLoad:方法,这个方法仅仅是通知RefreshBar,数据加载的过程已经结束了。
例如:
-(void)beginDataSourceLoading:(RefreshBar *)refreshBar{
_loading=YES;
loadedCount++;
_loading=NO;
// call the refresh bar, data loadingis end
[_refreshBardataSourceDidLoad:self.tableView];
}
hasMoreData方法是RefreshBar用于询问delegate对象是否还有新的行数据的方法。例如我们仅仅通过刷新动作的次数来决定是否还有多余的数据。例如,如果加载次数超过2次,我们就认为不再有新的行数据:
-(BOOL)hasMoreData{
returnloadedCount<3;
}
isDataSourceLoading方法是RefreshBar用于询问delegate对象是否数据加载过程已经结束的方法。在这个方法中,我们可以通过简单的判断标志变量来决定是否加载过程已结束:
-(BOOL)isDataSourceLoading{
return [selfhasMoreData] && _loading;
}
endDataSouceLoading方法允许你在数据加载完成时做一些事情,比如重新刷新TableView:
-(void)endDataSourceLoading:(RefreshBar *)refreshBar{
[self.tableViewreloadData];
}
四、demo程序
压缩包中包含demo,即ProgressiveRefreshTableApp目录。