您的位置:首页 > 移动开发 > IOS开发

【无限互联】IOS开发之下拉刷新控件

2014-10-05 15:04 197 查看
本节要点:

1.掌握下拉刷新、上拉加载控件的使用

2.大概了解实现原理

控件的使用:

1.添加头部控件的方法

[self.tableView addHeaderWithTarget:self action:@selector(headerRereshing)];
或者
[self.tableView addHeaderWithCallback:^{ }];

2.添加尾部控件的方法

 [self.tableView addFooterWithTarget:self action:@selector(footerRereshing)];
 或者
 [self.tableView addFooterWithCallback:^{ }];

 3.
可以在MJRefreshConst.h和MJRefreshConst.m文件中自定义显示的文字内容和文字颜色

 
 4.自动进入刷新状态
 1> [self.tableView headerBeginRefreshing];
 2> [self.tableView footerBeginRefreshing];

 
 5.结束刷新
 1> [self.tableView headerEndRefreshing];
 2> [self.tableView footerEndRefreshing];

实现原理:
1.通过调用[self.tableView addHeaderWithTarget:self action:@selector(headerRereshing)];这个方法跳转到下面代码,
MJRefreshHeaderView调用它的类方法header来创建一个新的header。

- (void)addHeaderWithTarget:(id)target
action:(SEL)action
{

    // 1.创建新的header
   if (!self.header) {

        MJRefreshHeaderView *header = [MJRefreshHeaderViewheader];
        [selfaddSubview:header];
       self.header = header;
    }

    

    // 2.设置目标和回调方法

    self.header.beginRefreshingTaget = target;

    self.header.beginRefreshingAction = action;
}

2.控制控件的刷新状态,定义了一个枚举

typedef enum {
MJRefreshStatePulling =1,//
松开就可以进行刷新的状态
MJRefreshStateNormal =2,//
普通状态
MJRefreshStateRefreshing =3,//
正在刷新中的状态
    MJRefreshStateWillRefreshing =4
} MJRefreshState;

3.改变枚举状态

- (void)adjustStateWithContentOffset
{

    //
当前的contentOffset

    CGFloat currentOffsetY =self.scrollView.mj_contentOffsetY;

    //
头部控件刚好出现的offsetY
   CGFloat happenOffsetY = -self.scrollViewOriginalInset.top;

    

    //如果是向上滚动到看不见头部控件,直接返回
   if (currentOffsetY >= happenOffsetY)return;

    
   if (self.scrollView.isDragging) {

        //
普通 和
即将刷新 的临界点
       CGFloat normal2pullingOffsetY = happenOffsetY -self.mj_height;

        
       if (self.state ==MJRefreshStateNormal
&& currentOffsetY < normal2pullingOffsetY) {
           //转为即将刷新状态

            self.state =MJRefreshStatePulling;
        }elseif (self.state ==MJRefreshStatePulling
&& currentOffsetY >= normal2pullingOffsetY) {
           //转为普通状态

            self.state =MJRefreshStateNormal;
        }

    } elseif (self.state
==MJRefreshStatePulling) {//即将刷新 &&手松开
       //开始刷新

        self.state =MJRefreshStateRefreshing;
    }
}

4.当MJRefreshState的状态改变时通过一个switch语句,根据状态执行不同的操作

    switch (state) {

caseMJRefreshStateNormal://普通状态
        {

            if (self.state
== MJRefreshStateRefreshing) {

                [UIViewanimateWithDuration:MJRefreshSlowAnimationDuration
*0.6
animations:^{
                   self.activityView.alpha =0.0;
                }completion:^(BOOL finished) {
                   //停止转圈圈
                    [self.activityViewstopAnimating];

                    
                   //恢复alpha
                   self.activityView.alpha =1.0;
                }];

                dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
(int64_t)(MJRefreshSlowAnimationDuration *NSEC_PER_SEC)),dispatch_get_main_queue(),
^{
                   //再次设置回normal
                   _state =MJRefreshStatePulling;
                   self.state =MJRefreshStateNormal;
                });
               //直接返回
               return;
            }else {
               //显示箭头
               self.arrowImage.hidden =NO;

                
               //停止转圈圈
                [self.activityViewstopAnimating];
            }

break;
        }

            

        caseMJRefreshStatePulling:
           break;

            

caseMJRefreshStateRefreshing:
        {
           //开始转圈圈

[self.activityViewstartAnimating];
           //隐藏箭头

self.arrowImage.hidden
= YES;

            
           //回调

            if ([self.beginRefreshingTagetrespondsToSelector:self.beginRefreshingAction])
{

                objc_msgSend(self.beginRefreshingTaget,self.beginRefreshingAction,self);
            }

            

            if (self.beginRefreshingCallback) {

                self.beginRefreshingCallback();
            }

break;
        }
       default:
           break;
}
5.改变文字的内容

- (void)settingLabelText
{

switch (self.state) {

caseMJRefreshStateNormal:
           //设置文字

            self.statusLabel.text =self.pullToRefreshText;

break;

caseMJRefreshStatePulling:
           //设置文字

            self.statusLabel.text =self.releaseToRefreshText;

break;

        caseMJRefreshStateRefreshing:
           //设置文字

            self.statusLabel.text =self.refreshingText;

break;
       default:
           break;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: