主要思路通过UITableView继承之UIScrollView,在UIScrollView上实现下拉效果。
因为下拉的是在一个UIView上,所以一开始就要创建一个UIView将其添加到UIScrollView上。
为了让用户调用接口简单方便,所以通过创建一个分类来实现个实现接口。
UIScrollView
(MJRefresh)这个分类是用创建下拉和上拉的效果的UIView,在这里还会创建监听KVO,用于监听下拉和上拉的状态变化。
代码思路:
这里分为五部分,首先是共有部分,下拉的文字提示模块,下拉动画提示模块,上拉文字模块,上拉动画提示模块。
首先要理解的是UITableView继承之UIScrollView,这是我们实现涮新的基础。因为我们滑动动作的监听着是UIScrollView,刷新状态的改变是有UIScrollView告述我们的。所以我们首要做的是如何监听UIScrollView的改变,大家都会想可以用ScrollView的代理方法可以监听。是可以实现但问题是你写的库是给别人用的,你只能提供的入口是越简单越好。这里MJ使用了ScrollView的分类来实现入口的调用以SEL来实现回掉。
知识点一在分类中进行实例化,
大家都知道在分类中是不能进行实例化的,因为分类是一个类它是没有开辟内存的能力,也就是无法往里添加东西。但是有种情况是可以在分类中进行实例化的,那就是分类中直接使用runtime机制进行实例化。使用runtime机制进行实例化那就受外部条件几乎为零,我们的使用oc语言进行实例化的底层就是这样(这里不懂的可以参考oc方法的缓存机制)。
知识点二使用到了多继承,
在这里有一个共同的父类那就是(也称之为基类)MJRefreshComponent。通过继承使我们的业务逻辑进行了分层,便于修改和维护。
知识点三使用SEL来进行回掉,
SEL概论:Objective-C在编译的时候,会根据方法的名字(包括参数序列),生成一个用来区分这个方法的唯一的一个ID,这个ID就是SEL类型的。我们需要注意的是,只要方法的名字(包括参数序列)相同,那么它们的ID都是相同的。就是说,不管是超类还是子类,不管是有没有超类和子类的关系,只要名字相同那么ID就是一样的。
SEL具体的使用方法如下:
1SEL变量名=@selector(方法名字);
2SEL变量名=NSSelectorFromString(方法名字的字符串);
3NSString*变量名=NSStringFromSelector(SEL参数);
创建步骤:
首先要明确的是MJRefreshComponent是父类,不管是怎么创建的一定会执行父类中的init方法,这也就是我们开始。
步骤一
通过在子类中使用构造化实例
步骤二
进行初始化
init
重写方法:
获取父类方法,UIview创建就调用:
创建一个KVO,用于监听UIScrollView的状态
通过KVO调用MJRefreshHeader中-(void)scrollViewContentOffsetDidChange:(NSDictionary*)change来对scrollView是否拉动进行逻辑处理
逻辑处理过程中会涉及到set方法的state这里会用来改变UI的状态
文字UI
动画UI
总结:
这里用了一个多继承来进行分层,这是一个很好的借鉴的地方发,总的来说太该是有三层。第一层大概是父类,这层这一块主要是进行初始化和对外部的接口,
第二层大概都是下拉的逻辑处理,第三层是UI的创建和根据业务的变化对UI进行改变。(这一块我只是正对普通状态下的模块进行总结,自定义动画和文字是有所不同的)。这样的思路对我们UI和逻辑很好的分层进行了一个很好的借鉴对我们来说是一个例子。这是我目前的总结我感觉还是有什么地方不太细致以后还要加一改动。