完成刷新有两种方式:1):使用苹果自带的控件 UIRefreshControl
2):使用第三方框架 EGOTableViewPullRefresh (手动管理内存,ARC下需要混编 -- -fno-objc-arc )
注:上拉刷新,一般应用是在TableView的尾部,上拉可以加载更多数据。--使用第三方框架实现
a:使用苹果自带控件 -- UIRefreshControl
原理:该控件是继承自contorl的,所以直接添加响应事件即可。-- 事件为,值改变 UIControlEventValueChanged。
01:创建UIRefreshControl控件,该控件不用设置frame属性。
02:设置属性文字。
03:然后将其添加到UITableView上。
04:完成响应事件(开始刷新)[refreshControlbeginRefreshing]
注意:完成网络请求后,要结束刷新 [refreshControlendRefreshing];
<span style="font-size:14px;"><span style="font-family: Menlo;">UIRefreshControl *</span> _refreshControl=[[UIRefreshControl alloc]init]; _refreshControl.attributedTitle=[[NSAttributedString alloc]initWithString:@"下拉刷新"]; [_refreshControl addTarget:self action:@selector(triggerDownRefresh) forControlEvents:UIControlEventValueChanged]; [self.tableView addSubview:_refreshControl];</span>
//完成响应事件
-(void)triggerDownRefresh { //在这里开始刷新
<p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo; color: rgb(52, 149, 175);"><span style="color: #000000"> [</span>refreshControl<span style="color: #000000"> </span>beginRefreshing<span style="color: #000000">];</span></p> <p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo; color: rgb(52, 149, 175);"> refreshControl<span style="color: #000000">.</span>attributedTitle<span style="color: #000000">=[[</span>NSAttributedString<span style="color: #000000"> </span>alloc<span style="color: #000000">]</span>initWithString<span style="color: #000000">:</span><span style="font-family: 'Helvetica Neue'; color: rgb(180, 38, 26);">@"</span><span style="font-family: 'Heiti SC Light'; color: rgb(180, 38, 26);">刷新中。。。</span><span style="font-family: 'Helvetica Neue'; color: rgb(180, 38, 26);">"</span><span style="color: #000000">];</span></p> //进行网络请求
…………省略
……
//当请求完成后,需要关闭刷新
<p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: 'Heiti SC Light'; color: rgb(0, 143, 0);"><span style="font-family: 'Helvetica Neue';"> //</span>结束刷新--一般是在网络请求结束的方法中结束刷新</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo; color: rgb(52, 149, 175);"><span style="color: #000000"> [</span>refreshControl<span style="color: #000000"> </span>endRefreshing<span style="color: #000000">];</span></p> <p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: Menlo; color: rgb(52, 149, 175);"> refreshControl<span style="color: #000000">.</span>attributedTitle<span style="color: #000000">=[[</span>NSAttributedString<span style="color: #000000"> </span>alloc<span style="color: #000000">]</span>initWithString<span style="color: #000000">:</span><span style="font-family: 'Helvetica Neue'; color: rgb(180, 38, 26);">@"</span><span style="font-family: 'Heiti SC Light'; color: rgb(180, 38, 26);">刷新结束。。。</span><span style="font-family: 'Helvetica Neue'; color: rgb(180, 38, 26);">"</span><span style="color: #000000">];</span></p> }
下拉刷新
01:创建下拉视图,需要设置frame。通过这个frame来判断是否滑动偏移超过了这个frame,只有超过这个frame才会触发刷新。
02:设置代理
03:将其,添加到UITableView上。
04:实现两个协议:
第一:UIScrollViewDelegate(这是在UITableViewDelegate中实现了UIScrollViewDelegate协议)
<p style="margin-top: 0px; margin-bottom: 0px; font-size: 18px; font-family: 'Helvetica Neue'; color: rgb(4, 51, 255);">#pragma mark -- <span style="font-family: 'Heiti SC Light';">实现</span>UIScrollViewDelegate<span style="font-family: 'Heiti SC Light';">协议(</span> <span style="font-family: 'Heiti SC Light';">这是在</span>UITableViewDelegate<span style="font-family: 'Heiti SC Light';">中实现了</span>UIScrollViewDelegate<span style="font-family: 'Heiti SC Light';">协议</span> <span style="font-family: 'Heiti SC Light';">)</span></p>
//(判断松手的瞬间)获取偏移量 -(void)scrollViewDidScroll:(UIScrollView *)scrollView { //获取偏移量 [_headRefreshView egoRefreshScrollViewDidScroll:scrollView]; } //结束拖拽 布尔值是是否减速 -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { [_headRefreshView egoRefreshScrollViewDidEndDragging:scrollView]; }
第二:EGORefreshTableHeaderDelegate协议
#pragma mark -- 实现EGORefreshTableHeaderDelegate协议 //触发刷新,刷新数据就写在这里(比如:请求) - (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view { //正在刷新 避免在刷新是再拖拽会触发再刷新 _isRefresh=YES; //模拟刷新 [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(refreshData) userInfo:nil repeats:NO]; } -(void)refreshData { [_dataArray addObject:@"123"]; [_tableView reloadData]; //结束刷新 [_headRefreshView egoRefreshScrollViewDataSourceDidFinishedLoading:_tableView];
</pre><pre name="code" class="objc"> //在结束刷新以后再恢复 _isRefresh=NO; } - (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view { return _isRefresh; }
//返回最后一次刷新时间 - (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view { return [NSDate date];//就是返回当前时间 }
上拉刷新,加载更多:
01:创建上拉视图,赞不需要设置frame。
(因为它得等到tableView数据加载完毕后,添加到tableview得尾部,它frame是在变化的)。
-(void)setRefreshViewFrame { //如果contentsize的高度比表的高度小,那么就需要把刷新视图放在表的bounds的下面 int height = MAX(self.tableView.bounds.size.height, self.tableView.contentSize.height); _egoFootView.frame =CGRectMake(0.0f, height, self.view.frame.size.width, 60); }
//更新界面
[self.tableViewreloadData];
[selfsetRefreshViewFrame];
02:设置代理
03:将其,添加到UITableView上。
04:实现两个协议:
#pragma mark-- UIScrollViewDelegate -(void)scrollViewDidScroll:(UIScrollView *)scrollView { if (_egoFootView) { [_egoFootView egoRefreshScrollViewDidScroll:scrollView]; } } -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { if (_egoFootView) { [_egoFootView egoRefreshScrollViewDidEndDragging:scrollView]; } }
#pragma mark -- EGORefreshTableFooterDelegate - (void)egoRefreshTableFooterDidTriggerRefresh:(EGORefreshTableFooterView*)view { _isUpRefreshing=YES; [self startUpRefresh]; } - (BOOL)egoRefreshTableFooterDataSourceIsLoading:(EGORefreshTableFooterView*)view { return _isUpRefreshing; } - (NSDate*)egoRefreshTableFooterDataSourceLastUpdated:(EGORefreshTableFooterView*)view { return [NSDate date]; }
效果:
上拉刷新随着tableview的加载,更新视图的frame
附上一个基类的TableViewController,继承它的每个ViewController就可以使用很简单的代码来实现上拉刷新,已经下拉刷新
-----------------------