阅读MJRefresh小记

MJRefresh是iOS中一个非常常用的刷新控件的第三方库,源码的阅读也由于有MJ老师的注释而非常轻松,以下做个简要记录。

缘由

项目是由Swift编写,通过桥接文件集成了MJRefresh和FMDB。以前写OC时也没觉得集成OC的第三方有啥不好,但是强迫症害人不浅啊。

源码解读

1. 源码主要类的功能解读
  • MJRefreshComponent 作为整个刷新控件的基类,定义刷新控件的状态,刷新的方法以及子类应该实现的方法。
  • MJRefreshHeader作为下拉刷新控件的基类,实现了下拉刷新的功能,但具体的刷新视图并未实现,如果想自定义刷新视图,则可继承该类视图。
  • MJRefreshFooter 作为下拉加载更多的基类,以下进一步分为上拉自动加载MJRefreshAutoFooter和上拉显式加载MJRefreshBackFooter,可根据需要继承上述两类,以实现上拉加载更多的自定义视图
  • UIScrollView+MJRefresh该分类通过运行时机制,给UIScrollView类动态添加了headerfooter属性,关于运行时机制可参考谈谈Runtime
2. 实现思路小结
  • 通过KVO监听UIScrollViewcontentOffset属性,根据contentOffset.y来设置刷新控件的不同状态。
  • 依据状态的变化来驱动事件,在refreshing状态下临时设定contentInset.topcontentInset.bottom的值来控制刷新视图的展现,在状态变化后还原。
  • 通过运行时机制给UIScrollView动态添加属性,以方便用户集成。

拓展

  • iOS6开始,UITableViewController自身带有一个refreshControl,实现它即可设置一个简单的刷新控件;iOS10更进一步,UITableView拥有一个refreshControl
  • 关于UIRefreshControl内部默认有个UIActivityIndicatorView的菊花视图,可以通过移除子视图,然后重新布局来实现自定义UIRefreshControl

总结

  • UIScrollView是iOS最常用的控件,UITableViewUICollectionView都继承自它。熟悉UIScrollView的属性和方法很有必要。具体属性这里不再赘笔,需要的可以看看UIScrollView的属性和用法

写代码这种事终究是知其然,更要知其所以然!

你可能感兴趣的:(阅读MJRefresh小记)