MJRefresh GitHub地址:https://github.com/CoderMJLee/MJRefresh

利用业余时间研究了一下iOS的开发,发现OC特定的语法方式吸引了我,而且iOS开发中有很多有趣的东西,正是如此,重新激起了我对开发学习的兴趣。自学过程中,知道了这个MJRefresh,MJ真乃大神也。

废话不多说,MJRefresh集成了UIView,UICollectionView,UITableView的上下拉刷新功能,而且还有自定义文字,动画等功能。针对GitHub上的源代码研究了一翻,打算照抄一遍,理解里面的机制并且期待能从自己的实战中学到新的东西。相信敲完一遍之后对它的理解又是一个新的层次。

MJRefresh的结构大致是这样子的:

MJRefreshComponent自然是父类,它定义了基本的文字大小,颜色,刷新事件,block,以及开始刷新,结束刷新等基本操作和属性。

 @interface MJRefreshComponent : UIView
{
UIEdgeInsets _scrollViewOriginalInset;
__weak UIScrollView *_scrollView;
} #pragma mark - 文字处理
/** 文字颜色 */
@property (strong, nonatomic) UIColor *textColor;
/** 字体大小 */
@property (strong, nonatomic) UIFont *font; #pragma mark - 刷新处理
/** 正在刷新的回调 */
@property (copy, nonatomic) void (^refreshingBlock)();
/** 设置回调对象和回调方法 */
- (void)setRefreshingTarget:(id)target refreshingAction:(SEL)action;
@property (weak, nonatomic) id refreshingTarget;
@property (assign, nonatomic) SEL refreshingAction;
/** 进入刷新状态 */
- (void)beginRefreshing;
/** 结束刷新状态 */
- (void)endRefreshing;
/** 是否正在刷新 */
- (BOOL)isRefreshing;
@end

我个人认为,最重要的两个类就是 MJRefreshHeader和MJRefreshFooter。因为刷新事件的精髓就在这两个类里面,Footer不多做介绍。我个人理解是,主要通过KVO监听 contentOffSet属性变化来判断当时是否是刷新、还是下拉、还是正在刷新或者改变刷新状态,核心代码当然我还是因为自身水平的原因没太看懂,相信敲完一遍之后会明白吧。核心代码如下:

#pragma mark 根据contentOffset调整state
- (void)adjustStateWithContentOffset
{
if (self.state != MJRefreshHeaderStateRefreshing) {
// 在刷新过程中,跳转到下一个控制器时,contentInset可能会变
_scrollViewOriginalInset = _scrollView.contentInset;
} // 在刷新的 refreshing 状态,动态设置 content inset
if (self.state == MJRefreshHeaderStateRefreshing ) {
if(_scrollView.contentOffset.y >= -_scrollViewOriginalInset.top ) {
_scrollView.mj_insetT = _scrollViewOriginalInset.top;
} else {
_scrollView.mj_insetT = MIN(_scrollViewOriginalInset.top + self.mj_h,
_scrollViewOriginalInset.top - _scrollView.contentOffset.y);
}
return;
} // 当前的contentOffset
CGFloat offsetY = _scrollView.mj_offsetY;
// 头部控件刚好出现的offsetY
CGFloat happenOffsetY = - _scrollViewOriginalInset.top; // 如果是向上滚动到看不见头部控件,直接返回
if (offsetY >= happenOffsetY) return; // 普通 和 即将刷新 的临界点
CGFloat normal2pullingOffsetY = happenOffsetY - self.mj_h;
if (_scrollView.isDragging) {
self.pullingPercent = (happenOffsetY - offsetY) / self.mj_h; if (self.state == MJRefreshHeaderStateIdle && offsetY < normal2pullingOffsetY) {
// 转为即将刷新状态
self.state = MJRefreshHeaderStatePulling;
} else if (self.state == MJRefreshHeaderStatePulling && offsetY >= normal2pullingOffsetY) {
// 转为普通状态
self.state = MJRefreshHeaderStateIdle;
}
} else if (self.state == MJRefreshHeaderStatePulling) {// 即将刷新 && 手松开
self.pullingPercent = 1.0;
// 开始刷新
self.state = MJRefreshHeaderStateRefreshing;
} else {
self.pullingPercent = (happenOffsetY - offsetY) / self.mj_h;
}
}

最后呢,通过UIScrollView+MJRefresh扩展来实现UIScrollView的控件下拉刷新集成。每多读一次代码就有一次新的收获。还等什么,赶紧去敲出来吧。

浅谈对MJRefresh(上)下拉刷新控件的理解的更多相关文章

  1. 上拉加载下拉刷新控件WaterRefreshLoadMoreView

    上拉加载下拉刷新控件WaterRefreshLoadMoreView 效果: 源码: // // SRSlimeView // @author SR // Modified by JunHan on ...

  2. android官方下拉刷新控件SwipeRefreshLayout的使用

    可能开发安卓的人大多数都用过很多下拉刷新的开源组件,但是今天用了官方v4支持包的SwipeRefreshLayout觉得效果也蛮不错的,特拿出来分享. 简介:SwipeRefreshLayout组件只 ...

  3. Android PullToRefresh下拉刷新控件的简单使用

    PullToRefresh这个开源库早就听说了,不过一直没用过.作为一个经典的的开源库,我觉得还是有必要认识一下. 打开github上的网址:https://github.com/chrisbanes ...

  4. Android仿苹果版QQ下拉刷新实现(一) ——打造简单平滑的通用下拉刷新控件

    前言: 忙完了结婚乐APP的开发,终于可以花一定的时间放在博客上了.好了,废话不多说,今天我们要带来的效果是苹果版本的QQ下拉刷新.首先看一下目标效果以及demo效果:      因为此效果实现的步骤 ...

  5. Android下拉刷新控件--PullToRefresh的简单使用

    Android中很多时候都会用到上下拉刷新,这是一个很常用的功能,Android的v4包中也为我们提供了一种原生的下拉刷新控件--SwipeRefreshLayout,可以用它实现一个简洁的刷新效果, ...

  6. Android 解决下拉刷新控件和ScrollVIew的滑动冲突问题。

    最近项目要实现ScrollView中嵌套广告轮播图+RecyleView卡片布局,并且RecyleView按照header和内容的排列样式,因为RecyleView的可扩展性很强,所以我毫无疑问的选择 ...

  7. Android——谷歌官方下拉刷新控件SwipeRefreshLayout(转)

    转自:http://blog.csdn.net/zouzhigang96/article/details/50476402 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言: 如今谷歌推出了 ...

  8. 基于PtrFrameLayout实现自定义仿京东下拉刷新控件

    前言 最近基于项目需要,使用PtrFrameLayout框架实现了自定义的下拉刷新控件,大体效果类似于京东APP的下拉刷新动态效果.在这里和大家分享一下具体的思路和需要注意的地方,以便帮助有类似开发和 ...

  9. [Android]下拉刷新控件RefreshableView的实现

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4172483.html 需求:自定义一个ViewGroup,实现 ...

随机推荐

  1. web.coofig 配置跨域问题

    <customHeaders> <add name="/> <add name="Access-Control-Allow-Origin" ...

  2. Lucence学习之一:全文检索的基本原理

    本文转载自:  http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623594.html 一.总论 根据http://lucene.ap ...

  3. redis(6)lua脚本

    一.lua脚本 lua是一种轻量小巧的脚本语言,用标准的C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. lua的详细内容你可以参考lua官方网站 ...

  4. Java接口和抽象类理解(New)

    一. 抽象类和接口的特点  包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法.注意,抽象类和普通类的主要有三点区别: 1)抽象方法必 ...

  5. LeetCode Find Peak Element [TBD]

    说要写成对数时间复杂度,算了想不出来,写个O(n)的水了 class Solution { public: int findPeakElement(const vector<int> &a ...

  6. 移动端Hybird的网络层优化策略

    一.前端代码策略:域名切换(多域名部署),解决DNS缓存及域名劫持 二.客户端策略 客户端在空闲时ping cdn节点域名列表中的域名,测量延时.丢包等数据.如果延迟 > xxx,丢包 > ...

  7. 10分钟学会Less开发环境搭建与初体验

    Less 是一门 CSS 预处理语言,它扩充了 CSS 语言,增加了诸如变量.混合(mixin).函数等功能,让 CSS 更易维护.方便制作主题.扩充. 今天看一下,10分钟能不能手把手快速教会你Le ...

  8. 准备Activiti开发环境

    1.添加jar包 在activiti-5.13 -> wars 目录下 解压 activiti-rest.war ,导入WEB-INF\lib下所有包添加到classpath中. 由于使用的是O ...

  9. 如何在一台机器上运行2个Tomcat

    比如:有两个版本的tomcat,一个5.*,一个6.*,此时由于两个工程分别部署在两个 版本的tomcat下,需要同时启动两个tomcat,以下是方法: 1.特别要注意:不要设置CATALINA_HO ...

  10. C++基础--class的大小

    在这里列出了空类,类有函数,值,没有函数的大小,注意Class也是默认字节对齐 #include <stdio.h> class x { }; class cx { public: cx( ...