如何写一套下拉刷新的控件?《MJRefresh原理浅析》

相信大家有很多人在做项目的时候都在使用MJRefresh控件来实现下拉刷新的功能;

MJRefresh经过不断的重构与更新迭代,现在不管是功能上还是代码结构上都是相当不错的,都是很值我们去学习的.

下面就是MJRefresh开源框架中中主要的一些类文件

MJRefresh主要的类文件

MJRefresh的使用相信都难不倒大家

今天我主要想和大家分享一下MJRefresh的想法,因为我觉得这才是最重要的,献丑了,有理解的不对和不深入的地方,请大家多多点评哈!

试想,如果没有MJRefresh开源框架,公司让你来写这样一个框架?

你应该怎么写?

应该从哪几个方面考虑?

应该怎么下手?

应该注意一些什么?

下面我分了六个步骤给大家说一下

第 1 步: 主要说了一下大体思路和注意事项

第 2 步:为什么使用UIScrollView ?

第 3 步:如何给UIScrollView增加新的属性header ?

第 4 步:Header类里主要写一些什么  ?

第 5 步:如何利用KVO的方式来监听偏移量的变化(设置刷新状态)?

第 6 步:实例化Header类的对象 去给 UIScrollView的属性header赋值 ?

step1:

如果想给UITableView 和UICollectionView 增加下拉刷新 上提加载的功能

其实不要想的太复杂,其实就是给他们:

1.先增加一个头视图(header) 和 尾视图(footer)

2.然后就是考虑状态的变化(正在刷新啊,刷新完成啊),通过偏移量来判断

3.最后给这些状态设置一些监听事件(下拉刷新的时候调用什么方法,没有数据了调用什么方法等)

如果能实现上面几点的话,一个简单粗糙的下拉刷新的控件就可以实现了

但是具体操作的时候我们还是要考虑几点问题:

1.首先要满足以后能够很方便给TableView和CollectionView的去增加这个特性,

2.能够很好的去适配最新的SDK

3.增加特性后要减少甚至避免此特性(下拉刷新)不与其它UI控件和其他特性发生冲突

根据上面的几点问题我们有以下两种选择:

1.自己重写一套UIScrollView并且加上下拉刷新的特性(但是很有难度,不建议这样);

2.最好的方式是使用IOS的特性Category来增加下拉刷新的功能(选择这种方式来实现);

step2:

接下来我们要考虑的就是给TableView加还是给UICollectionView?(其实很简单,大神们可以忽略这个问题)我们选择的是UIScrollView

为什么使用ScrollView?而不使用TableView 和 CollectionView增加Category ? __

大家应该都知道 UITableView 和 UICollectionView 都是继承于 ScrollView

如果我们使用UIScrollView的话,以后不管是tableView 和 CollectionView都可以直接使用下拉刷新的特性

但我们如果使用UITableView的话,我们肯定还必须为UICollectionView 写一套新的下拉刷新的方法;

使用UIScrollView 会很大程度上提高我们这个下拉组件的延展性和兼容性__

step3:

接下来就是需要来考虑我们如何使用UIScrollView和Catgory的特性来增加下拉刷新和上提加载的功能 ? ? ?

满足下面两点:

1.下拉刷新?上提加载?

2.为了方便以后容易使用?

最好的方式是给UIScrollView 添加两个属性 一个是header 一个是Footer ,这样以后就可以直接利用这两个属性做事情了;

这个时候我们就需要考虑给UIScrollView添加属性了,如何给UIScrollView添加属性?

有点IOS基础的应该都知道,我们不能直接给Category添加属性;

但是可用通过采用动态添加属性的方法objc_setAssociatedObject()和objc_getAssociatedObject()函数给UIScrollView动态添加属性

这是一种关联对象的技巧(AssociatedObject)

给UIScrollView增加header属性

当然添加Footer的方法也是这样,添加Footer的时候只需要修改一下Key 就好,就先不讲Footer的实现了

step4:

既然添加完属性,那此时我们就需要想着如何给属性赋值?

所以接下来我们的工作就是写一个header的类

然后用Header类的对象给我们新增加的scrollView的header属性赋值

#当然现在MJRefresh这个框架已经进行了代码重构,现在框架的结构比较清晰,但是对一些刚开始接触IOS的同学看起来就会有些费劲了_#现在咱们只讲一些主要的代码,先不考虑MJRefresh的代码结构#因为它现在的代码是重构之后的,而咱们现在讲的是实现的思路#先按照我们正常的思路来分析一下

首先创建一个类Header去继承UIView 但header类里面要写什么呢?

1.首先肯定少不了一些主要的布局 如 下拉的ImageView,以及UIActivityIndicatorView等

2.其次是 下拉刷新那一块会有很多的状态的变化,比如 正在刷新中,刷新完成,刚开始刷新等状态的判断,(这些状态我们需要通过 UIScrollView 的偏移量来计算这些状态。这一块主要就是一些逻辑判断,如何计算这次暂时不讲了

3.最后就是看需求了,如果需要时间的加时间,需要GIF的加GIF动画;

普通的Header

带GIF的header

step5:

如何计算刷新状态呢 ?

所以此时我们不得不需要另一个知识点:事件监听(监听 UIScrollView的偏移量变化情况);

说到监听的话,IOS有几种经典的方式用来监听(以后有时间会给大家讲一下它们的优缺点和用法):

1.KVO

2.NSNotificationCenter

3.Delegate等

MJRefresh中使用的是KVO的方式监听偏移量:

下面的willMoveToSuperView方法中传过来的newSuperView是你实现此功能的UITableView 和 UICollectionView的对象,此方法只在设置tableView的下拉和上提的时候执行一次(或者说只在当前页面初始化的时候执行一次);

此时我们通过 addObserver forKeyPath 的方式监听了ContentOffset的变化

设置偏移量监听

由于我们在上面设置了偏移量的监听,那么当UIScrollView的偏移量变化时,都会执行 observerValueForKeyPath方法

在这里面我们可以做一系列的逻辑判断,比如 刷新状态的变化,一些动画效果什么的(具体的判断就不说了,不然就就偏离了这篇文章的主题)

监听事件的执行

具体的偏移量变化判断暂不讲解;

偏移量逻辑判断方法

step6:

至此,我们基本上就把MJRefresh的下拉刷新的实现的大体流程给过了一遍,以后如果想丰富一下MJRefresh的话,比如增加时间的变化,或者增加GIF图片的效果,我觉得都不是太难的问题了,因为框架已经搭起来了以后想往里面塞什么东西,那就看需求了

最后我们要做的就是 写一个方法去实例化一个header的对象,然后将这个对象赋值给我们的UIScrollView的header属性

实例化一个header的对象

这样就可以实现一个简单的下拉刷新控件

这边文章主要讲了一下我们写MJRefresh的思路,没有讲一些具体实现方法

个人认为 编程重要的是思路,是想法,把想法理解透了,以后不管是OC 还是Android 还是Java PHP都是可以用的上的

以上只是个人对MJRefresh的理解,有一些理解不到的地方希望大家多多指教,多多批评

链接:https://www.jianshu.com/p/9d5a3c543768

來源:简书

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容