iOS 李明杰 MJRefresh源码解析

iOS 李明杰 MJRefresh源码解析,第1张

MJRefresh 是著名开发者及培训讲师李明杰老师的作品,到现在在github已经有10000多颗star,真真是极好用的iOS下拉刷新(也支持上拉加载更)控件。本文主要素材来源有 正在学hybrid开发的iOS开发者 J_Knight 的文章和 github 上李明杰老师的用法介绍(主要是本文下部分)。

该框架的结构设计得很清晰,使用一个基类MJRefreshComponent来做一些基本的设定,然后通过继承的方式,让MJRefreshHeader和MJRefreshFooter分别具备下拉刷新和上拉加载的功能。从继承机构来看可以分为三层,具体可以从下面的图里看出来:

其中一条继承链是这样的

开发者一般使用场景是这样的:

作者 在类目 UIScrollView+MJRefresh 中运用运行时关联属性函数 objc_setAssociatedObject 和 objc_getAssociatedObject 对 UIScrollView 视图控件添加了 mj_header 、 mj_footer 等属性

MJRefreshNormalHeader 是最下层的子类, headerWithRefreshingTarget 和 headerWithRefreshingBlock 是最上层基类 MJRefreshComponent 暴露出的静态快捷构造方法。把对象的创建下放到子类,此处明显用到了工厂方法。编译时类型 mj_header is classof MJRefreshHeader ,运行时类型 MJRefreshNormalHeader 是其子类,此处是典型的多态特性的应用。

即面向接口编码,而非面向实现编码。作者从最上层基类 MJRefreshComponent 即暴露接口

具体实现:

具体实现,首先来看一下该控件的基类:MJRefreshComponent:

这个类作为该控件基类,涵盖了基类所具备的成份:状态,回调block等,大致分成下面这5种职能:

监听的声明:offset、size、state

对于监听的处理:

从上面等结构图可以看出,紧接着这个基类,下面分为<code>MJRefreshHeader</code>和<code>MJRefreshFooter</code>,这里顺着<code>MJRefreshHeader</code>这个分支向下展开:

<code>MJRefreshHeader</code>继承于<code>MJRefreshComponent</code>,它做了这几件事:

初始化有两种方法:动作-目标/block块函数 做回调

通过重写<code>prepare</code>方法来设置header的高度:

通过重写placeSubviews方法来重新调整y值:

这里提供一张图来体现三个状态的不同:

这个类是<code>MJRefreshHeader</code>类的子类,它做了两件事:

给一张图,让大家直观感受一下这两个控件:

这个类通过覆盖父类三个方法来实现上述两个实现:

在这里,将每一个状态对应的提示文字放入一个字典里面,<code>key</code>是状态的<code>NSNumber</code>形式

这里主要是对<code>lastUpdatedTimeLabel</code>和<code>stateLabel</code>进行布局。要注意<code>lastUpdatedTimeLabel</code>隐藏的情况。

在这里,根据传入的<code>state</code>不同,在<code>stateLabel</code>和<code>lastUpdatedTimeLabel</code>里切换相应的文字。

<code>MJRefreshNormalHeader </code>继承于 <code>MJRefreshStateHeader</code>,它主要做了两件事:

给一张图来直观感受一下这两个view:

同<code>MJRefreshStateHeader</code>一样,也是重写了父类的三个方法:

到此为止,我们已经从<code>MJRefreshComponent</code>到<code>MJRefreshNormalHeader</code>的实现过程看了一遍。可以看出,作者将<code>prepare</code>,<code>placeSubviews</code>以及 setState: 方法作为基类的方法,让下面的子类去一层一层实现。

而每一层的子类,根据自身的职责,分别按照自己的方式来实现这三个方法:

这样做的好处是,如果想要增加某种类型的 header ,只要在某一层上做文章即可。例如该框架里的 MJRefreshGifHeader ,它和 MJRefreshNormalHeader 属于同一级,都是继承于 MJRefreshStateHeader 。因为二者都具有相同形式的 stateLabel 和 lastUpdatedTimeLabel ,唯一不同的就是左侧的部分:

还是提供一张图来直观感受一下:

下面我们来看实现:

它提供了两个接口,是用来设置不同状态下使用的数组的:

和MJRefreshNormalHeader一样,它也重写了基类提供的三个方法来实现显示gif的职能。

来的随后,他就来到“闪电星感动”,做了一期节目节目中,他用大学生

突发脑溢血,却无钱医治的真实事例,感动了许多好心的人,他们纷纷为大学生献出了自己的一片爱心

光良还进行了“爱心拍卖”将自己拍新专辑封面时穿的一件衣服作为拍品,以一元起拍,拍了出去这时

,光良唱起了大学生最喜欢听的一首《童话》大家又再一次为大学生捐款,现场十分感人我也留着泪

,给节目组发短信,因为一条短信就代表着我的一片心意最终,光良顺利地为这位大学生筹齐了医药费

这时,现场又响起那熟悉的旋律

“……你要相信,相信我们会像童话故事里,幸福和快

ios7暂时还没有越狱教程。为什么要越狱?是要下载免FEI的应用吗?还是想要那种九宫格的输入法,大部分人越狱都是因为这两个原因吧……如果是这两个可以用快用苹果助手,应用YOU戏都是免FEI的,九宫格输入法在快用下个APP就可以。

苹果手机查看网页源代码的方法是:打开Safari浏览器——点击网址分享——点击书签——命名后点击存储——点击书签——点击编辑——点击看源代码即可查看。

苹果手机查看网页源代码的方法是:

1打开Safari浏览器,随便开一个网页以百度为例,然后点击网址栏左边的分享按钮红框中

2分享列表中找到书签,点击书签红框中

3标题改为你想改成的任意名字,这里例子为‘看源代码’。然后点击“存储”

4接下来,点击地址栏右边的书签图标看红框,在d出的菜单中点下面的‘编辑’看红框

5点击‘看源代码’那项。在下图的红框中粘贴下面代码,依次点击后退,点击完成。

以上就是关于iOS 李明杰 MJRefresh源码解析全部的内容,包括:iOS 李明杰 MJRefresh源码解析、如何查看ios 系统函数的源代码、斯坦福ios7 能不能获得课程源码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9308610.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存