俗話說“工欲善其事,必先利其器”一個好的成熟的第三方庫,是開發路上的一把利器,可節約很多開發成本。
先簡單的介紹下上下拉刷新的原理:大部分的上下拉刷新控件,都是用contentInset實現的。默認情況下,如果一個UIScrollView在導航欄的正下方,那么它的contentInset是64,而contentOffset是-64。繼續下拉的話,contentOffset就會越來越小,如果上滑,contentOffset就會增大,直到左上角達到屏幕的左上角時,contentOffset剛好為0。默認情況下,如果下拉一個UIScrollView,在松手之后,會彈回初始的位置(導航欄下方)。而大部分的下拉刷新控件,都是將自己放在UIScrollView的上方,起始y設置成負數,所以平時不會顯示出來,只有下拉的時候才會出現,放開又會彈回去。然后在loading的時候,臨時把contentInset增大,相當于把UIScrollView往下擠,于是下拉刷新的控件就會顯示出來,然后刷新完成后,再把contentIset改回原來的值,實現回彈的效果。基本上,MJRefresh也是這么實現的。
上下拉刷新的方法有系統自帶的UIRefreshControl,第三方庫MJRefresh,JHRefresh這里就簡單的介紹下MJRefresh的使用
1. 導入MJRefresh
pod 'MJRefresh'
2.導入頭文件
#import "MJRefresh.h"
3.下拉刷新
默認狀態效果
self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
gif動畫效果
// 當下拉刷新時會調用loadNewData,在這個方法里用來刷新數據
MJRefreshGifHeader *header = [MJRefreshGifHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
UIImage * image1 = [UIImage imageNamed:@"loading01.png"];
UIImage * image2 = [UIImage imageNamed:@"loading02.png"];
UIImage * image3 = [UIImage imageNamed:@"loading03.png"];
UIImage * image4 = [UIImage imageNamed:@"loading04.png"];
// 設置普通狀態的動畫圖片
NSArray *idleImages = @[image1, image2, image3, image4];
[header setImages:idleImages forState:MJRefreshStateIdle];
// 設置即將刷新狀態的動畫圖片(一松開就會刷新的狀態)
NSArray *pullingImages = @[image1, image2, image3, image4];
[header setImages:pullingImages forState:MJRefreshStatePulling];
// 設置正在刷新狀態的動畫圖片
NSArray *refreshingImages = @[image1, image2, image3, image4];
[header setImages:refreshingImages forState:MJRefreshStateRefreshing];
// 設置文字
[header setTitle:@"Pull down to refresh" forState:MJRefreshStateIdle];
[header setTitle:@"Release to refresh" forState:MJRefreshStatePulling];
[header setTitle:@"Loading ..." forState:MJRefreshStateRefreshing];
// 設置字體
header.stateLabel.font = [UIFont systemFontOfSize:15];
header.lastUpdatedTimeLabel.font = [UIFont systemFontOfSize:14];
// 設置顏色
header.stateLabel.textColor = [UIColor redColor];
header.lastUpdatedTimeLabel.textColor = [UIColor blueColor];
// 隱藏時間
header.lastUpdatedTimeLabel.hidden = YES;
// 設置 header
self.tableView.mj_header = header;
loadNewData方法
-(void)loadNewData{
// 這里可以獲取數據,獲取數據成功后tableView重新加載數據
[self.tableView reloadData];
// 結束刷新
[self.tableView.mj_header endRefreshing];
}
4.上拉刷新
默認狀態效果
self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreTopic)];
gif動畫效果
MJRefreshAutoGifFooter *footer = [MJRefreshAutoGifFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreTopic)];
// 設置普通狀態的動畫圖片
NSArray *idleImages1 = @[image1, image2, image3, image4];
[footer setImages:idleImages1 forState:MJRefreshStateIdle];
// 設置即將刷新狀態的動畫圖片(一松開就會刷新的狀態)
NSArray *pullingImages1 = @[image1, image2, image3, image4];
[footer setImages:pullingImages1 forState:MJRefreshStatePulling];
// 設置正在刷新狀態的動畫圖片
NSArray *refreshingImages1 = @[image1, image2, image3, image4];
[footer setImages:refreshingImages1 forState:MJRefreshStateRefreshing];
// 設置文字
[footer setTitle:@"Click or drag up to refresh" forState:MJRefreshStateIdle];
[footer setTitle:@"Loading more ..." forState:MJRefreshStateRefreshing];
[footer setTitle:@"No more data" forState:MJRefreshStateNoMoreData];
// 設置字體
footer.stateLabel.font = [UIFont systemFontOfSize:17];
// 設置顏色
footer.stateLabel.textColor = [UIColor blueColor];
// 隱藏刷新狀態的文字
// footer.refreshingTitleHidden = YES;
// 如果沒有上面的方法,就用footer.stateLabel.hidden = YES;
// 設置尾部
self.tableView.mj_footer = footer;
loadMoreTopic方法
-(void)loadMoreTopic{
// 這里獲取數據,獲取成功后tableView再重新加載數據
[self.tableView reloadData];
// 結束刷新
[self.tableView.mj_footer endRefreshing];
}