MJRefresh框架使用及说明

2023-09-24 29 0

一. MJRefresh的类解释.

在这里插入图片描述

类名 说明
MJRefreshComponent 所有刷新控件的基类别. (component: 成分,组件)
MJRefreshNormalHeader 默认的下拉刷新控件
MJRefreshAutoNormalFooter 默认的上拉刷新控件,下拉刷新控件自适应在页面内容下面
MJRefreshAutoGifFooter 带动态图的上拉加载控件,下拉刷新控件自适应在页面内容下面
MJRefreshBackNormalFooter 默认的上拉刷新控件,下拉刷新控件一直在屏幕底部
MJREfreshBackGifFooter 默认的上拉动画刷新控件,下拉刷新控件一直在屏幕底部

总结:

  • 刷新控件分为: header和footer控件. 头部和尾部刷新控件
  • 刷新控件分为normal和gif状态. 普通状态和刷新控件和gif动态图的刷新控件
  • 尾部刷新控件又分为: auto和back两个模式,自适应尾部刷新控件位置和刷新控件位置在底部.

二.各个类中提供的外部方法.

1. MJRefreshComponent

- (void)beginRefreshing;  // 开始刷新,进入页面想要自动刷新的时候调用.
- (void)endRefreshing;    // 结束刷新,网络请求结束的时候使用.@property(assign, nonatomic) BOOL refreshing;     // 是否正在刷新// MJRefreshState 刷新控件的状态/** 刷新控件的状态 */
typedef NS_ENUM(NSInteger, MJRefreshState) {/** 普通闲置状态 */MJRefreshStateIdle = 1,/** 松开就可以进行刷新的状态 */MJRefreshStatePulling,/** 正在刷新中的状态 */MJRefreshStateRefreshing,/** 即将刷新的状态 */MJRefreshStateWillRefresh,/** 所有数据加载完毕,没有更多的数据了 */MJRefreshStateNoMoreData
};@property(assign, nonatomic) BOOL automaticallyChangeAlpha; // 根据拖拽比例自动切换透明度

2. MJRefreshHeader

/** 这个key用来存储上一次下拉刷新成功的时间 */
@property(copy, nonatomic) NSString *lastUpdatedTimeKey;
/** 上一次下拉刷新成功的时间 */
@property(strong, nonatomic, readonly) NSDate *lastUpdatedTime;/** 创建header */
+ (instancetype)headerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock;
/** 创建header */
+ (instancetype)headerWithRefreshingTarget:(id)target refreshingAction:(SEL)action;

3. MJRefreshFooter

/** 创建footer */
+ (instancetype)footerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock;
/** 创建footer */
+ (instancetype)footerWithRefreshingTarget:(id)target refreshingAction:(SEL)action;- (void)endRefreshingWithNoMoreData; // 提示没有更多数据.
- (void)resetNoMoreData; // 重置没有更多数据@property(assign, nonatomic) automaticallyHidden; // 自动根据有无数据来显示或者隐藏(有数据就显示,没数据就隐藏.默认为NO)

三.具体使用

1. 默认的刷新方式

头部刷新控件: MJRefreshNormalHeader
尾部刷新控件: MJRefreshAutoNormalFooter

- (UITableView *)tableView
{if (!_tableView){self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];self.tableView.dataSource = self;self.tableView.delegate = self;// 默认的下拉刷新和上拉加载self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{         // 这个地方是网络请求的处理dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[self.tableView.mj_header endRefreshing];});}];self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{// 这个地方是网络请求的处理dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[self.tableView.mj_footer endRefreshing];});}];}return _tableView;
}

2.显示动画

头部刷新控件: MJRefreshGifHeader
尾部刷新控件: MJRefreshAutoGifFooter / MJRefreshBackGifFooter

- (UITableView *)tableView
{if (!_tableView){self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];self.tableView.dataSource = self;self.tableView.delegate = self;MJRefreshGifHeader *header = [MJRefreshGifHeader headerWithRefreshingBlock:^{dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[self.tableView.mj_header endRefreshing];});}];NSMutableArray *arrayM = [NSMutableArray arrayWithCapacity:0];for (int i = 0; i < 30; i ++) {UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"xz_flower_%d",i + 1]];[arrayM addObject:image];}// 设置普通状态下的动画图片  -->  静止的一张图片NSArray *normalImagesArray = @[[UIImage imageNamed:@"xz_flower_1"]];[header setImages:normalImagesArray forState:MJRefreshStateIdle];// 设置即将刷新状态的动画图片[header setImages:arrayM forState:MJRefreshStatePulling];        // 设置正在刷新状态的动画图片[header setImages:arrayM forState:MJRefreshStateRefreshing];// 设置headerself.tableView.mj_header = header;}return _tableView;
}

3.设置刷新控件的时间和状态的显示或者隐藏

- (UITableView *)tableView
{if (!_tableView){self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];self.tableView.dataSource = self;self.tableView.delegate = self;MJRefreshGifHeader *header = [MJRefreshGifHeader headerWithRefreshingBlock:^{            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[self.tableView.mj_header endRefreshing];});}];NSMutableArray *arrayM = [NSMutableArray arrayWithCapacity:0];for (int i = 0; i < 30; i ++) {UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"xz_flower_%d",i + 1]];[arrayM addObject:image];}NSArray *normalImagesArray = @[[UIImage imageNamed:@"xz_flower_1"]];[header setImages:normalImagesArray forState:MJRefreshStateIdle];[header setImages:arrayM forState:MJRefreshStatePulling];       [header setImages:arrayM forState:MJRefreshStateRefreshing];// 隐藏时间header.lastUpdatedTimeLabel.hidden = YES;// 隐藏状态header.stateLabel.hidden = YES;// 设置headerself.tableView.mj_header = header;}return _tableView;
}

4. 自定义刷新控件的文字大小和颜色

- (UITableView *)tableView
{if (!_tableView){self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];self.tableView.dataSource = self;self.tableView.delegate = self;MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{                [self.tableView.mj_header endRefreshing];});}];// 设置文字[header setTitle:@"下拉刷新" forState:MJRefreshStateIdle];[header setTitle:@"更新" forState:MJRefreshStatePulling];[header setTitle:@"Loading..." forState:MJRefreshStateRefreshing];// 设置字体header.stateLabel.font = [UIFont systemFontOfSize:15];header.lastUpdatedTimeLabel.font = [UIFont systemFontOfSize:12];// 设置颜色header.stateLabel.textColor = [UIColor redColor];header.lastUpdatedTimeLabel.textColor = [UIColor redColor];[header beginRefreshing];self.tableView.mj_header = header;}return _tableView;
}

5. 当全部加载完毕的时候,改变尾部刷新控件的显示(不允许再刷新)

- (UITableView *)tableView
{if (!_tableView){self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];self.tableView.dataSource = self;self.tableView.delegate = self;MJRefreshAutoNormalFooter *footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[self.tableView.mj_footer endRefreshing];[self.tableView.mj_footer endRefreshingWithNoMoreData];});}];self.tableView.mj_footer = footer;}return _tableView;
}

重设加载完毕

[self.tableView.mj_footer resetNoMoreData];

6. 自定义刷新控件

继承 MJRefreshHeader / MJRefreshGifHeader / MJRefreshAutoGifFooter / MJRefreshBackGifFooter / MJRefreshAutoFooter /MJRefreshBackFooter

#import "MJRefreshHeader.h"@interface MCDIYHeader : MJRefreshHeader@end#import "MCDIYHeader.h"@interface MCDIYHeader ()@property(weak, nonatomic) UILabel *label;
@property(weak, nonatomic) UISwitch *s;
@property(weak, nonatomic) UIImageView *logo;
@property(weak, nonatomic) UIActivityIndicatorView *loading;@end@implementation MCDIYHeader#pragma mark - 重写方法
#pragma mark 在这里做一些初始化配置(比如添加子控件)
- (void)prepare {[super prepare];// 设置控件的高度self.mj_h = 50;// 添加labelUILabel *label = [[UILabel alloc] init];label.textColor = [UIColor colorWithRed:1.0 green:0.5 blue:0.0 alpha:1.0];label.font = [UIFont boldSystemFontOfSize:16];label.textAlignment = NSTextAlignmentCenter;[self addSubview:label];self.label = label;// 打酱油的开关UISwitch *s = [[UISwitch alloc] init];[self addSubview:s];self.s = s;// logoUIImageView *logo = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Logo"]];logo.contentMode = UIViewContentModeScaleAspectFit;[self addSubview:logo];self.logo = logo;// loadingUIActivityIndicatorView *loading = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];[self addSubview:loading];self.loading = loading;
}#pragma mark 在这里设置子控件的位置和尺寸
- (void)placeSubviews
{[super placeSubviews];self.label.frame = self.bounds;self.logo.bounds = CGRectMake(0, 0, self.bounds.size.width, 100);self.logo.center = CGPointMake(self.mj_w * 0.5, - self.logo.mj_h + 20);self.loading.center = CGPointMake(self.mj_w - 30, self.mj_h * 0.5);
}#pragma mark 监听scrollView的contentOffset改变
- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change
{[super scrollViewContentOffsetDidChange:change];
}#pragma mark 监听scrollView的contentSize改变
- (void)scrollViewContentSizeDidChange:(NSDictionary *)change
{[super scrollViewContentSizeDidChange:change];
}#pragma mark 监听scrollView的拖拽状态改变
- (void)scrollViewPanStateDidChange:(NSDictionary *)change
{[super scrollViewPanStateDidChange:change];
}#pragma mark 监听控件的刷新状态
- (void)setState:(MJRefreshState)state
{MJRefreshCheckState;switch (state) {case MJRefreshStateIdle:[self.loading stopAnimating];[self.s setOn:NO animated:YES];self.label.text = @"赶紧下拉吖(开关是打酱油滴)";break;case MJRefreshStatePulling:[self.loading stopAnimating];[self.s setOn:YES animated:YES];self.label.text = @"赶紧放开我吧(开关是打酱油滴)";break;case MJRefreshStateRefreshing:[self.s setOn:YES animated:YES];self.label.text = @"加载数据中(开关是打酱油滴)";[self.loading startAnimating];break;default:break;}
}#pragma mark 监听拖拽比例(控件被拖出来的比例)
- (void)setPullingPercent:(CGFloat)pullingPercent
{[super setPullingPercent:pullingPercent];// 1.0 0.5 0.0// 0.5 0.0 0.5CGFloat red = 1.0 - pullingPercent * 0.5;CGFloat green = 0.5 - 0.5 * pullingPercent;CGFloat blue = 0.5 * pullingPercent;self.label.textColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0];
}@end

使用:

- (UITableView *)tableView
{if (!_tableView){self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];self.tableView.dataSource = self;self.tableView.delegate = self;// 使用自定的刷新控件self.tableView.mj_header = [MCDIYHeader headerWithRefreshingBlock:^{            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[self.tableView.mj_header endRefreshing];});[self.tableView.mj_header beginRefreshing];}];}return _tableView;
}
代码编程
赞赏

相关文章

n的阶乘【清华大学】
全自动档案蓝光光盘检测刻录系统案例
求最大最小数【清华大学】
质因数的个数【清华大学】
信刻国产电子档案蓝光光盘刻录存储备份归档管理应用
最大公约数【哈尔滨工业大学】