MJRefresh简单分析

1. 使用说明

tableView.mj_header = NGAnimationRefreshHeaderView(refreshingBlock: {

    weakself?.loadData()

})

2.基本原理讲解

首先我们先来看两张图


通过这两张图,我们大致的梳理下MJ的原理。MJ的Header和Footer并不是直接加在UIScrollview(及其子类,本文UITableView和UICollectionView都不再单独提起,直接UIScrollview说明,原理是一样的),而是加在contentInset中的,因此需要使用MJ的时候必须要保证alwaysBounceVertical为True,否则无效。

我们在使用时,直接设置Header和Footer就可以使用,因为设置时调用setter方法,MJ已经在内部通过这个方法为我们处理好了所有的流程。不得不说,这个控件封装的的确是太厉害了。


3.流程图说


其中WillRefresh和NoMoreData这两个状态没有在流程图中提及。

WillRefresh 是在当前界面没有显示,设置的一个临时状态

NoMoreData 用于上拉加载更多时,没有更多数据的时候


4.详细分析和关键代码分析

MJRefreshComponent类,所有footer和header的父类

监听了scrollView的contentOffset和contentInset和pan的state变化,通过这几个变化让MJRefreshComponent子类做出不同的变化。

当拉下刷下时,headerView可以一直显示是因为,当达到刷新临界点时,会通过resetInset方法让UIScrollView下移


5.模拟拉上刷新代码

    let scrollView = UIScrollView()

    scrollView.backgroundColor = .red

    self.view.addSubview(scrollView)

    scrollView.alwaysBounceVertical = true

    scrollView.contentInset = UIEdgeInsets(top: -30, left: 0, bottom: 0, right: 0)

    let topView = UIView(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 30))

    topView.backgroundColor = .cyan

    scrollView.addSubview(topView)

    scrollView.snp.makeConstraints { (make) in

        make.edges.equalToSuperview()

    }

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容