技术经验分享:iOS_MJRefrash的详解以及使用

简介: 技术经验分享:iOS_MJRefrash的详解以及使用

MJRefresh Github 效果动态图来这里看吧


该博客Demo下载地址


一. MJRefresh的类解释.


1.MJRefreshComponent 所有刷新控件的基类别.(component: 成分,组件)


2.MJRefreshNormalHeader 默认的下拉刷新控件


3.MJRefreshAutoNormalFooter 默认的上拉刷新控件 下拉刷新控件自适应在页面内容下面


4.MJRefreshAutoGifFooter 带动态图的上拉加载控件 下拉刷新控件自适应在页面内容下面


5.MJRefreshBackNormalFooter 默认的上拉刷新控件 下拉刷新控件一直在屏幕底部


6.MJREfreshBackGifFooter 默认的上拉动画刷新控件 下拉刷新控件一直在屏幕底部


总结: 刷新控件分为: header和footer控件. 头部和尾部刷新控件


刷新控件分为normal和gif状态. 普通状态和刷新控件和gif动态图的刷新控件


尾部刷新控件又分为: auto和back两个模式 自适应尾部刷新控件位置和刷新控件位置在底部.


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


1.MJRefreshComponent


(1) beginRefreshing // 开始刷新,进入页面想要自动刷新的时候调用.


isRefreshing // 是否正在刷新


endRefreshing // 结束刷新,网络请求结束的时候使用.


(2) MJRefreshState 刷新控件的状态


/ 刷新控件的状态 */


typedef NS_ENUM(NSInteger, MJRefreshState) {


/ 普通闲置状态 /


MJRefreshStateIdle = 1,


/** 松开就可以进行刷新的状态 /


MJRefreshStatePulling,


/ 正在刷新中的状态 */


MJRefreshStateRefreshing,


/ 即将刷新的状态 /


MJRefreshStateWillRefresh,


/** 所有数据加载完毕,没有更多的数据了 /


MJRefreshStateNoMoreData


};


(3) automaticallyChangeAlpha 根据拖拽比例自动切换透明度


2.MJRefreshHeader


(1)


/ 这个key用来存储上一次下拉刷新成功的时间 /


@property (copy, nonatomic) NSString lastUpdatedTimeKey;


/ 上一次下拉刷新成功的时间 /


@property (strong, nonatomic, readonly) NSDate lastUpdatedTime;


(2)


/ 创建header */


+ (instancetype)headerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock;


/ 创建header /


+ (instancetype)headerWithRefreshingTarget:(id)target refreshingAction:(SEL)action;


3.MJRefreshFooter


(1)


/** 创建footer /


+ (instancetype)footerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock;


/* 创建footer /


+ (instancetype)footerWithRefreshingTarget:(id)target refreshingAction:(SEL)action;


(2) endRefreshingWithNoMoreData 提示没有更多数据.


resetNoMoreData 重置没有更多数据


(3) 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:@"xzflower%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


self.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:@"xzflower%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;


// 设置header


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


// 添加label


UILabel 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;


// logo


UIImageView logo = 【【UIImageView alloc】 initWithImage:【UIImage imageNamed:@"Logo"】】;


logo.contentMode = UIViewContentModeScaleAspectFit;


【self addSubview:logo】;


self.logo = logo;


// loading


UIActivityIndicatorView 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.5


CGFloat red = 1.0 - pullingPercent 0.5;


CGFloat green = 0.5 - 0.5//代码效果参考:http://www.lyjsj.net.cn/wx/art_22958.html

pullingPercent;

CGFloat blue = 0.5 * pullingPercent;


self.label.textColor = 【UIColor colorWithRed:red green:green blue:blue alpha:1.0】;


}


@end


使用:


<img src="//assets.cnblogs.com/ima

相关文章
|
3月前
|
安全 Android开发 iOS开发
Android vs. iOS:构建生态差异与技术较量的深度剖析###
本文深入探讨了Android与iOS两大移动操作系统在构建生态系统上的差异,揭示了它们各自的技术优势及面临的挑战。通过对比分析两者的开放性、用户体验、安全性及市场策略,本文旨在揭示这些差异如何塑造了当今智能手机市场的竞争格局,为开发者和用户提供决策参考。 ###
|
3月前
|
安全 Android开发 iOS开发
安卓与iOS的较量:技术深度对比
【10月更文挑战第18天】 在智能手机操作系统领域,安卓和iOS无疑是两大巨头。本文将深入探讨这两种系统的技术特点、优势以及它们之间的主要差异,帮助读者更好地理解这两个平台的独特之处。
65 0
|
2月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
34 2
|
2月前
|
存储 安全 算法
深入探索iOS系统安全机制:保护用户隐私的前沿技术
本文旨在探讨苹果公司在其广受欢迎的iOS操作系统中实施的先进安全措施,这些措施如何共同作用以保护用户的隐私和数据安全。我们将深入了解iOS的安全架构,包括其硬件和软件层面的创新,以及苹果如何通过持续的软件更新来应对新兴的安全威胁。此外,我们还将讨论iOS系统中的一些关键安全功能,如Face ID、加密技术和沙箱环境,以及它们如何帮助防止未经授权的访问和数据泄露。
|
2月前
|
监控 iOS开发 开发者
iOS性能优化:深入函数调用栈与符号化技术
在iOS开发中,函数调用栈是理解程序执行流程和优化性能的关键。当应用出现性能问题或崩溃时,能够准确地读取和解析调用栈信息对于快速定位问题至关重要。本文将探讨iOS中的函数调用栈,以及如何通过符号化技术进行有效的性能调优。
39 3
|
2月前
|
安全 搜索推荐 Android开发
揭秘安卓与iOS系统的差异:技术深度对比
【10月更文挑战第27天】 本文深入探讨了安卓(Android)与iOS两大移动操作系统的技术特点和用户体验差异。通过对比两者的系统架构、应用生态、用户界面、安全性等方面,揭示了为何这两种系统能够在市场中各占一席之地,并为用户提供不同的选择。文章旨在为读者提供一个全面的视角,理解两种系统的优势与局限,从而更好地根据自己的需求做出选择。
117 2
|
2月前
|
安全 搜索推荐 Android开发
揭秘iOS与安卓系统的差异:一场技术与哲学的较量
在智能手机的世界里,iOS和Android无疑是两大巨头,它们不仅定义了操作系统的标准,也深刻影响了全球数亿用户的日常生活。本文旨在探讨这两个平台在设计理念、用户体验、生态系统及安全性等方面的本质区别,揭示它们背后的技术哲学和市场策略。通过对比分析,我们将发现,选择iOS或Android,不仅仅是选择一个操作系统,更是选择了一种生活方式和技术信仰。
|
3月前
|
安全 Android开发 iOS开发
iOS与安卓:技术生态的双雄争霸
在当今数字化时代,智能手机操作系统的竞争愈发激烈。iOS和安卓作为两大主流平台,各自拥有独特的技术优势和市场地位。本文将从技术架构、用户体验、安全性以及开发者支持四个方面,深入探讨iOS与安卓之间的差异,并分析它们如何塑造了今天的移动技术生态。无论是追求极致体验的苹果用户,还是享受开放自由的安卓粉丝,了解这两大系统的内在逻辑对于把握未来趋势至关重要。
|
3月前
|
安全 搜索推荐 Android开发
揭秘iOS与Android系统的差异:一场技术与哲学的较量
在当今数字化时代,智能手机操作系统的选择成为了用户个性化表达和技术偏好的重要标志。iOS和Android,作为市场上两大主流操作系统,它们之间的竞争不仅仅是技术的比拼,更是设计理念、用户体验和生态系统构建的全面较量。本文将深入探讨iOS与Android在系统架构、应用生态、用户界面及安全性等方面的本质区别,揭示这两种系统背后的哲学思想和市场策略,帮助读者更全面地理解两者的优劣,从而做出更适合自己的选择。
|
3月前
|
安全 Android开发 iOS开发
安卓vs iOS:探索两种操作系统的独特魅力与技术深度###
【10月更文挑战第16天】 本文旨在深入浅出地探讨安卓(Android)与iOS这两种主流移动操作系统的特色、优势及背后的技术理念。通过对比分析,揭示它们各自如何塑造了移动互联网的生态,并为用户提供丰富多彩的智能体验。无论您是科技爱好者还是普通用户,都能从这篇文章中感受到技术创新带来的无限可能。 ###
67 2