本节要点:
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.创建新的header
if (!self.header) {
MJRefreshHeaderView *header = [MJRefreshHeaderViewheader];
[selfaddSubview:header];
self.header = header;
}
// 2.设置目标和回调方法
self.header.beginRefreshingTaget = target;
self.header.beginRefreshingAction = action;
}
typedef enum {
MJRefreshStatePulling =1,// 松开就可以进行刷新的状态
MJRefreshStateNormal =2,// 普通状态
MJRefreshStateRefreshing =3,// 正在刷新中的状态
MJRefreshStateWillRefreshing =4
} MJRefreshState;
- (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;
}
}
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;
}
- (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;
}
}