了在绝大多数的项目都用到上拉,下拉的开源三方控件MJRefresh
下载开源库MJRefresh https://github.com/CoderMJLee/MJRefresh
类的结构示意图
1.下拉使用带有红色的标记的两个类{1.MJRefreshNormalHeader (默认的下拉刷新)2.MJRefreshGifHeader
下面对默认的下拉刷新进行简单的使用
>1.引入头文件
#import"MJRefresh.h"
2.直接 MJRefreshNormal类方法 调用加载数据的网络请求
2.1添加刷新控件
self.tableView.mj_header=[MJRefreshNormal HeaderheaderWithRefreshingTarget:selfrefreshingAction:@selector(loadNewTopics)];
3.开始网络请求
[self.tableView.mj_headerbeginRefreshing];
4.在合适的时机结束网络请求
*发送请求给服务器,下拉刷新数据
- (void)loadNewTopics
{
>4.1.取消之前的请求()
声明的请求管理者的对象结束之前的网络请求的
XMGHTTPSessionManager *manager;
[self.manager.tasksmakeObjectsPerformSelector:@selector(cancel)];
>4.2 拼接参数
> 4.3发送请求
[self.managerGET:XMGCommonURLparameters:parametersprogress:nilsuccess:^(NSURLSessionDataTask*_Nonnulltask,id_NullableresponseObject) {
数据请求回来结束刷新
[self.tableView.mj_header endRefreshing];
}failure:^(NSURLSessionDataTask*_Nullabletask,NSError*_Nonnullerror) {
if(error.code!=NSURLErrorCancelled) {//并非是取消任务导致的error,其他网络问题导致的error
[SVProgressHUDshowErrorWithStatus:@"网络繁忙,请稍后再试!"];
}
[self.tableView.mj_header endRefreshing];(结束刷新的方法)
}];
}
二 .上拉刷新同理
1.添加上拉刷新的控件及其方法
self.tableView.mj_footer= [MJRefreshNormal WithRefreshingTarget:selfrefreshingAction:@selector(loadMoreTopics)];
2,结束下拉刷新
[self.tableView.mj_footerendRefreshing];
三.上拉,下拉展示样式改变
要改变上拉下拉里面的子控件的样式,不产生更多的代码
使用集成的方法
创建myHeard继承父类MJRefreshHeader改变其,改变其子类的属性,或者自定义器子类的样式及其控件就可以了
m
#import"XMGDIYHeader.h"
@interfaceXMGDIYHeader()
@property(nonatomic,weak)UISwitch*s;
@property(nonatomic,weak)UIImageView*logo;
@end
@implementationXMGDIYHeader
- (instancetype)initWithFrame:(CGRect)frame
{
if(self= [superinitWithFrame:frame]) {
UISwitch*s = [[UISwitchalloc]init];
[selfaddSubview:s];
self.s= s;
UIImageView*logo = [[UIImageViewalloc]initWithImage:[UIImageimageNamed:@"MainTitle"]];
[selfaddSubview:logo];
self.logo= logo;
//self.xmg_height = 70;
}
returnself;
}
- (void)layoutSubviews
{
[superlayoutSubviews];
self.logo.xmg_centerX=self.xmg_width*0.5;
self.logo.xmg_y=-3*self.logo.xmg_height;
self.s.xmg_centerX=self.xmg_width*0.5;
self.s.xmg_centerY=self.xmg_height*0.5;
}
#pragma mark -重写Header内部的方法
- (void)setState:(MJRefreshState)state
{
[supersetState:state];
if(state ==MJRefreshStateIdle) {//下拉可以刷新
[self.ssetOn:NOanimated:YES];
[UIViewanimateWithDuration:0.25animations:^{
self.s.transform=CGAffineTransformIdentity;
}];
}elseif(state ==MJRefreshStatePulling) {//松开立即刷新
[self.ssetOn:YESanimated:YES];
[UIViewanimateWithDuration:0.25animations:^{
self.s.transform=CGAffineTransformMakeRotation(M_PI_2);
}];
}elseif(state ==MJRefreshStateRefreshing) {//正在刷新
[self.ssetOn:YESanimated:YES];
[UIViewanimateWithDuration:0.25animations:^{
self.s.transform=CGAffineTransformMakeRotation(M_PI_2);
}];
}
}