美文网首页
MJRefresh源码阅读(二)

MJRefresh源码阅读(二)

作者: 落叶兮兮 | 来源:发表于2020-07-01 15:20 被阅读0次

上一篇MJRefresh源码阅读(一)中介绍了MJRefreshComponent的实现,这篇介绍MJRefreshHeader中的实现。
MJRefreshHeader是继承自MJRefreshComponent,是下拉刷新控件:负责监控用户下拉刷新的状态。在MJRefreshComponent中给UIScrollView的contentSize和congentOffSet属性添加了KVO监听,所以在下拉刷新的时候,contentOffset就会发生变化,然后会调用相应的方法:

[self scrollViewContentSizeDidChange:change];

在MJRefreshHeader中对该方法进行重写

//在该方法中通过UIScrollView的contentOffset偏移的大小和UIScrollView的topInset以及刷新的UIView的height高度的比较来判断出当前处于什么状态,给状态state赋值,而在前面有给手势pan的state添加kvo监听,pan手势取消时state发生变化会调用[self scrollViewPanStateDidChange:change];在子类中重写这个方法进行相应的逻辑处理
- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change {{
    [super scrollViewContentOffsetDidChange:change];
    
    // 在刷新的refreshing状态
    if (self.state == MJRefreshStateRefreshing) {
        [self resetInset];
        return;
    }
    
    // 跳转到下一个控制器时,contentInset可能会变
    _scrollViewOriginalInset = self.scrollView.mj_inset;
    
    // 当前的contentOffset
    CGFloat offsetY = self.scrollView.mj_offsetY;
    // 头部控件刚好出现的offsetY
    CGFloat happenOffsetY = - self.scrollViewOriginalInset.top;
    
    // 如果是向上滚动到看不见头部控件,直接返回
    // >= -> >
    if (offsetY > happenOffsetY) return;
    
    // 普通 和 即将刷新 的临界点
    CGFloat normal2pullingOffsetY = happenOffsetY - self.mj_h;
    CGFloat pullingPercent = (happenOffsetY - offsetY) / self.mj_h;
    
    if (self.scrollView.isDragging) { // 如果正在拖拽
        self.pullingPercent = pullingPercent;
        if (self.state == MJRefreshStateIdle && offsetY < normal2pullingOffsetY) {
            // 转为即将刷新状态
            self.state = MJRefreshStatePulling;
        } else if (self.state == MJRefreshStatePulling && offsetY >= normal2pullingOffsetY) {
            // 转为普通状态
            self.state = MJRefreshStateIdle;
        }
    } else if (self.state == MJRefreshStatePulling) {// 即将刷新 && 手松开
        // 开始刷新
        [self beginRefreshing];
    } else if (pullingPercent < 1) {
        self.pullingPercent = pullingPercent;
    }
}

后面看到在setState方法中,有对刷新时间做了存储,使用的是NSUserDefault

//保存刷新时间
[[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:self.lastUpdatedTimeKey];
 [[NSUserDefaults standardUserDefaults] synchronize];
//取出刷新时间
- (NSDate *)lastUpdatedTime
{
    return [[NSUserDefaults standardUserDefaults] objectForKey:self.lastUpdatedTimeKey];
}

相关文章

  • MJRefresh源码阅读3——干货整理

    前言 MJRefresh源码阅读1——结构梳理MJRefresh源码阅读2——核心类MJRefreshHeader...

  • MJRefresh

    MJRefresh原理分析从MJRefresh源码学习上拉下刷新的基本原理MJRefresh源码阅读使用Xtrac...

  • MJRefresh源码阅读(二)

    上一篇MJRefresh源码阅读(一)中介绍了MJRefreshComponent的实现,这篇介绍MJRefres...

  • MJRefresh源码阅读(三)

    继上一篇MJRefresh源码阅读(二)之后,这次开始介绍MJRefreshStateHeader,它是继承于MJ...

  • MJRefresh 源码阅读

    MJRefresh项目地址 https://github.com/CoderMJLee/MJRefresh下载下来...

  • MJRefresh源码阅读

    可改进部分 在 MJRefreshComponent.h 的 34 行, typedef void (^MJRef...

  • MJRefresh 源码阅读

    1、Runtime1.1 关联对象该框架为UIScrollView添加了两个“成员变量”,header和foote...

  • 阅读MJRefresh源码

    该框架的结构设计得很清晰,使用一个基类MJRefreshComponent来做一些基本的设定,然后通过继承的方式,...

  • 阅读MJRefresh源码

    先看一下源码目录结构: 1.Base MJRefreshComponent:基类(继承至UIView) ``` /...

  • MJRefresh源码阅读

    很多项目的上拉加载下拉刷新功能都是基于MJRefresh来实现的,下面通过源码来分析几个问题。 一、下拉刷新时,M...

网友评论

      本文标题:MJRefresh源码阅读(二)

      本文链接:https://www.haomeiwen.com/subject/jpjcqktx.html