MJRefresh原理分析

2023-11-17

MJRefresh是流行的下拉刷新控件,前段时间为了修复一个BUG,读了它的源码,本文总结一下实现的原理

下拉刷新的基本原理

大部分的下拉刷新控件,都是用contentInset实现的。默认情况下,如果一个UIScrollView的左上角在导航栏的正下方,那么它的contentInset是64,而contentOffset是-64。继续下拉的话,contentOffset就会越来越小,如果上滑,contentOffset就会增大,直到左上角达到屏幕的左上角时,contentOffset刚好为0

默认情况下,如果下拉一个UIScrollView,在松手之后,会弹回初始的位置(导航栏下方)。而大部分的下拉刷新控件,都是将自己放在UIScrollView的上方,起始y设置成负数,所以平时不会显示出来,只有下拉的时候才会出现,放开又会弹回去。然后在loading的时候,临时把contentInset增大,相当于把UIScrollView往下挤,于是下拉刷新的控件就会显示出来,然后刷新完成之后,再把contentInset改回原来的值,实现回弹的效果

基本上,MJRefresh也是这么实现的

创建下拉刷新控件实例

从创建实例的代码开始:

MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{

    [myController loadCollectionDataNeedReset:YES withBlock:^{
        [self.header endRefreshing];
        [self reloadData];
    }];
}];

调用的是一个工厂方法headerWithRefreshingBlock,这个方法定义在各种header控件的基类MJRefreshHeader里:

+ (instancetype)headerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock
{
    MJRefreshHeader *cmp = [[self alloc] init];
    cmp.refreshingBlock = refreshingBlock;
    return cmp;
}

然后会调用init方法,由于MJRefreshHeader里并没有定义init方法,而它的基类MJRefreshComponent里定义了,所以会进入到基类的初始化方法里:

- (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        // 准备工作
        [self prepare];

        // 默认是普通状态
        self.state = MJRefreshStateIdle;
    }
    return self;
}

这里的关键是prepare方法,这个方法是第一个扩展点,具体的header(包括库提供的原生header,和用户自定义的header)有哪些属性,样式是怎么样,都是在这个方法里实现的。每个子类的prepare方法,都会调用父类的prepare方法。所以在扩展的时候,公共的属性写在父类的prepare方法里,特有的属性写在子类的prepare方法里。比如,我们看一下MJRefreshStateHeader的:

- (void)prepare
{
    [super prepare];

    // 初始化文字
    [self setTitle:MJRefreshHeaderIdleText forState:MJRefreshStateIdle];
    [self setTitle:MJRefreshHeaderPullingText forState:MJRefreshStatePulling];
    [self setTitle:MJRefreshHeaderRefreshingText forState:MJRefreshStateRefreshing];
}

总之,调用headerWithRefreshingBlock方法以后,就得到了一个UIView的实例,也就是下拉

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MJRefresh原理分析 的相关文章

随机推荐

  • android studio for ubuntu,安装android studio for Ubuntu12.04.4-------(1)

    1安装jdk8 joe joe Aspire Z3730 sudo add apt repository ppa webupd8team java You are about to add the following PPA to your
  • 算法导论三-分治法

    分治法 简单说 分治法即分而治之 即将问题分化为小问题来处理 简化起来看有二到三个步骤 分 将问题分解为若干子问题 复杂度n降低 治 递归解决子问题 合 合并子问题的解 常见分治法的递归式为 T n 2T n 2 n 即分为两个解法一样的子
  • 从GitHub完整克隆项目及其依赖项子模块(submodule,recursive)

    环境 WIN10 GIT 2 31 1 示例项目 FreeRTOS GitHub 日期 2023 1 5 常规操作 从GitHub上克隆项目的常规操作 常规 git clone git github com FreeRTOS FreeRTO
  • Leetcode_977 有序数的平方

    给你一个按 非递减顺序 排序的整数数组 nums 返回 每个数字的平方 组成的新数组 要求也按 非递减顺序 排序 示例 1 输入 nums 4 1 0 3 10 输出 0 1 9 16 100 解释 平方后 数组变为 16 1 0 9 10
  • 海康监控H5 实时视频监控

    一 先上图 二 码农的代码吐槽下
  • 引入jstl标签库报错The absolute uri: http://java.sun.com/jstl/core cannot be resolved in either web.xml

    一 错误信息 org apache jasper JasperException The absolute uri http java sun com jstl core cannot be resolved in either web x
  • ip地址查询到网络地址和广播地址

    借鉴 维基百科 分类网络 百度百科 IP地址 维基百科 IP地址 名词解释 IP地址 互联网协议地址 英语 Internet Protocol Address 又译为网际协议地址 缩写为IP地址 英语 IP Address 是分配给网络上使
  • LeetCode-用两个栈实现队列

    注意 将栈stk移动到栈cache后 还得移动回来 否则会破坏先进先出的特性 class MyQueue public stack
  • JPEG编码原理及解码分析

    三 实验项目名称 JPEG原理分析及JPEG解码器的调试 四 实验目的 掌握JPEG编解码系统的基本原理 初步掌握复杂的数据压缩算法实现 并能根据理论分析需要实现所对应数据的输出 五 主要设备 安装Windows和Visual Studio
  • Portal数据清理过程说明

    Portal门户集成平台作为统一的门户搭建和展现平台 提供综合门户 信息门户 应用门户 数据门户等不同类型门户的建设能力 可以为企业构建门户网站 内部业务中心 同时对企业文档资料进行整合 统一归档 对内部 外部提供资料 通过门户平台的搭建
  • OpenGL 渲染点GL_POINTS

    场景 渲染点的时候 如果尺寸比较大 实际上是一个矩形 需要采用反走样技术 使用反走样要启用混合操作 确保显卡的反走样设置是用户控制或者打开的 代码 include
  • VIM编辑器使用

    VIM编辑器使用 Vim编辑器的三种工作模式 命令模式 默认模式 复制 粘贴 剪切 切换到其他模式 输入模式 编辑模式 a i o 针对每个字符进行编辑 删除 末行模式 扩展模式 保存 退出 保存并退出 字符替换等 命令模式 向下翻页 Pa
  • div标签增加右上角删除图标

    一 需求描述 在Div标签的右上角显示删除图标 二 实现方式 html CSS 三 参考代码
  • 【轮播图的实现】JS的音乐播放器

    轮播图使用的场景通常在网页首页上 在有限的空间可以通过轮播图 循环播放同一类型的图片 文字等内容 轮播图目前表现形式有 2 种 一种是常规的只出现一张图片 另一种是出现三张图片凸显一张的卡片化的 因为轮播图广泛使用 目前很多工具库 例如 s
  • Linux 搭建Web虚拟机(Apache httpd),单台机搭建多web站点

    一 基础知识 虚拟web主机 指的是在同一台服务器中运行多个web站点 其中的每一个站点实际上并不独自占用整个服务器 可以充分利用服务器的硬件资源 从而大大减低网站构建及运行成本 使用httpd可以非常方便地构建虚拟机主机服务器 只需要运行
  • 2012腾讯校园招聘笔试成都站回忆版

    腾讯的笔试题目比较基础 具体的题目记不清除了 设计到的知识点 1 c语言基础 sizeof strlen的用法 2 linux基本命令umask 3 SQL语言 4 数据结构的知识 建立二叉树 顺序表操作的复杂度 5 操作系统的知识 通过页
  • c语言scanf用法

    C语言中scanf的用法和注意事项 scanf概念 scanf是格式输入函数 功能是在屏幕上输入指定的信息 简单的来说和printf相似却不相同 scanf调用格式 scanf lt 格式化字符串 gt lt 地址表 gt 如 includ
  • C Primer Plus 第六章编程练习

    第六章 编程练习 6 1 题 目 编写一个程序 创建一个包含26个元素的数组 并在其中储存26个 小写字母 然后打印数组的所有内容 完成时间 2020 2 3 作 者 林夕
  • 【项目实战】大文件断点续传,搞起

    今天给大家分享的又是一篇实战文章 也是最近私活里遇到的 万能的互联网给了我办法 分享一下 背景 最近接到一个新的需求 需要上传2G左右的视频文件 用测试环境的OSS试了一下 上传需要十几分钟 再考虑到公司的资源问题 果断放弃该方案 一提到大
  • MJRefresh原理分析

    MJRefresh是流行的下拉刷新控件 前段时间为了修复一个BUG 读了它的源码 本文总结一下实现的原理 下拉刷新的基本原理 大部分的下拉刷新控件 都是用contentInset实现的 默认情况下 如果一个UIScrollView的左上角在