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

本节要点:

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.hMJRefreshConst.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;

}

}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值