轉載: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目錄。