MJRefresh是iOS中一个非常常用的刷新控件的第三方库,源码的阅读也由于有MJ老师的注释而非常轻松,以下做个简要记录。
缘由
项目是由Swift编写,通过桥接文件集成了MJRefresh和FMDB。以前写OC时也没觉得集成OC的第三方有啥不好,但是强迫症害人不浅啊。
源码解读
1. 源码主要类的功能解读
-
MJRefreshComponent
作为整个刷新控件的基类,定义刷新控件的状态,刷新的方法以及子类应该实现的方法。 -
MJRefreshHeader
作为下拉刷新控件的基类,实现了下拉刷新的功能,但具体的刷新视图并未实现,如果想自定义刷新视图,则可继承该类视图。 -
MJRefreshFooter
作为下拉加载更多的基类,以下进一步分为上拉自动加载MJRefreshAutoFooter
和上拉显式加载MJRefreshBackFooter
,可根据需要继承上述两类,以实现上拉加载更多的自定义视图 -
UIScrollView+MJRefresh
该分类通过运行时机制,给UIScrollView类动态添加了header
和footer
属性,关于运行时机制可参考谈谈Runtime
2. 实现思路小结
- 通过
KVO
监听UIScrollView
的contentOffset
属性,根据contentOffset.y
来设置刷新控件的不同状态。 - 依据状态的变化来驱动事件,在
refreshing
状态下临时设定contentInset.top
和contentInset.bottom
的值来控制刷新视图的展现,在状态变化后还原。 - 通过运行时机制给
UIScrollView
动态添加属性,以方便用户集成。
拓展
- 从
iOS6
开始,UITableViewController
自身带有一个refreshControl
,实现它即可设置一个简单的刷新控件;iOS10
更进一步,UITableView
拥有一个refreshControl
。 - 关于
UIRefreshControl
内部默认有个UIActivityIndicatorView
的菊花视图,可以通过移除子视图,然后重新布局来实现自定义UIRefreshControl
。
总结
-
UIScrollView
是iOS最常用的控件,UITableView
和UICollectionView
都继承自它。熟悉UIScrollView
的属性和方法很有必要。具体属性这里不再赘笔,需要的可以看看UIScrollView的属性和用法
写代码这种事终究是知其然,更要知其所以然!
网友评论