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

MJRefresh源码阅读(一)

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

看源代码时首先应该找到代码在github上的地址,基本上作者都会在github上的README上介绍使用的用法。
源码的地址为https://github.com/CoderMJLee/MJRefresh
,在readME中作者有列出整个代码的结构,如下图所示:

image.png
从上面的结构,我们可以看出,从刷新控件的基类MJRefreshComponent开始看起
1.看代码发现在交给子类方法去实现的方法后面都有添加一个宏NS_REQUIRES_SUPER,该宏的定义为:

define NS_REQUIRES_SUPER attribute((objc_requires_super))

_attribute((objc_requires_super))在2012年9月首次引入到CLANG中,并在2013年10月进行了介绍。在OS X和iOS上,现在都有一个NS_REQUIRES_SUPER宏,它根据编译器支持有条件地包装objc_requires_super属性。一旦方法声明附加了这个宏,编译器将会产生一个警告,如果super没有被覆盖该方法的子类调用。
这个宏可以有效的提醒我们忘记在子类中写

【super 父类方法】;

会弹出一个警告提醒我们。
2.在initWithFrame中调用了prepare方法

- (void)prepare
{
    // 基本属性
    self.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    self.backgroundColor = [UIColor clearColor];
}

这是为了适配不同大小的视图,使该刷新UIView和父视图左右的间距保持不变,相应的UIViewAutoresizing枚举类的各个含义如下:

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
    //不会随父视图的改变而改变
    UIViewAutoresizingNone                 = 0,
    //自动调整view与父视图左边距,以保证右边距不变
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    //自动调整view的宽度,保证左边距和右边距不变
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    //自动调整view与父视图右边距,以保证左边距不变
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    //自动调整view与父视图上边距,以保证下边距不变
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
   //自动调整view的高度,以保证上边距和下边距不变
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
   //自动调整view与父视图的下边距,以保证上边距不变
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};

之后,在layoutSubViews中调用方法

//默认布局,可以在子类中进行更改
[self placeSubViews];

之后重写了- (void)willMoveToSuperview:(UIView *)newSuperview方法,本身这个方法是不执行任何操作的,但是我们可以重写它添加一些我们想要的额外操作,该方法是父视图发生变化时调用。
在方法里面移除旧的UIScrollView的监听,给newSuperview添加新的监听
添加新的监听的方法为:

#pragma mark - KVO监听
//添加监听
- (void)addObservers
{
    NSKeyValueObservingOptions options = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld;
    [self.scrollView addObserver:self forKeyPath:MJRefreshKeyPathContentOffset options:options context:nil];
    [self.scrollView addObserver:self forKeyPath:MJRefreshKeyPathContentSize options:options context:nil];
//添加拖拽手势
    self.pan = self.scrollView.panGestureRecognizer;
    [self.pan addObserver:self forKeyPath:MJRefreshKeyPathPanState options:options context:nil];
}

//移除监听
- (void)removeObservers
{
    [self.superview removeObserver:self forKeyPath:MJRefreshKeyPathContentOffset];
    [self.superview removeObserver:self forKeyPath:MJRefreshKeyPathContentSize];
//移除拖拽手势
    [self.pan removeObserver:self forKeyPath:MJRefreshKeyPathPanState];
    self.pan = nil;
}

关于kvo的解释,可以参考这个作者的链接
https://www.jianshu.com/p/3bdc82e0ed4e

相关文章

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

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

  • MJRefresh

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

  • MJRefresh源码阅读(一)

    看源代码时首先应该找到代码在github上的地址,基本上作者都会在github上的README上介绍使用的用法。源...

  • 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框架的了解 -> MJRefresh

    MJRefresh源码地址:CoderMJLee/MJRefresh · GitHub 一、基本结构 github...

网友评论

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

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