下拉或上拉刷新 -- 苹果自带 和 第三方库

完成刷新有两种方式: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>
}

b:使用第三方框架 -- EGOTableViewPullRefresh

下拉刷新


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];//就是返回当前时间
}
下拉或上拉刷新 -- 苹果自带 和 第三方库_第1张图片 下拉或上拉刷新 -- 苹果自带 和 第三方库_第2张图片


上拉刷新,加载更多:

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);
}

当tabliew重载数据后,也要改变上拉刷新的视图

        //更新界面

        [self.tableViewreloadData];

        [selfsetRefreshViewFrame];



02:设置代理

03:将其,添加到UITableView上。

04:实现两个协议:



 第一: UIScrollViewDelegate 这是在 UITableViewDelegate 中实现了 UIScrollViewDelegate 协议

#pragma  mark-- UIScrollViewDelegate
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    
    if (_egoFootView) {
        [_egoFootView egoRefreshScrollViewDidScroll:scrollView];
    }
}
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    
    if (_egoFootView) {
        [_egoFootView egoRefreshScrollViewDidEndDragging:scrollView];
    }
}

第二:  EGORefreshTableFooterDelegate 协议

#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

下拉或上拉刷新 -- 苹果自带 和 第三方库_第3张图片  下拉或上拉刷新 -- 苹果自带 和 第三方库_第4张图片  


下拉或上拉刷新 -- 苹果自带 和 第三方库_第5张图片



-----------------------

   附上一个基类的TableViewController,继承它的每个ViewController就可以使用很简单的代码来实现上拉刷新,已经下拉刷新

-----------------------


你可能感兴趣的:(下拉或上拉刷新 -- 苹果自带 和 第三方库)