由于上一篇文章MJRefresh源码分析之下拉刷新已经介绍的非常清楚了。此文主要介绍上拉刷新的核心方法。
从我们调用MJRefresh
框架中的下面代码说起。
self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
}];
MJRefreshAutoFooter
类中- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change
和- (void)scrollViewPanStateDidChange:(NSDictionary *)change
,这两个方法作用是什么呢?触发上拉刷新的
- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change
{
[super scrollViewContentOffsetDidChange:change];
if (self.state != MJRefreshStateIdle || !self.automaticallyRefresh || self.mj_y == 0) return;
if (_scrollView.mj_insetT + _scrollView.mj_contentH > _scrollView.mj_h) { // 内容超过一个屏幕
// 这里的_scrollView.mj_contentH替换掉self.mj_y更为合理
// 是否刷新的临界点
//_scrollView.mj_contentH + _scrollView.mj_insetB - _scrollView.mj_h
if (_scrollView.mj_offsetY >= _scrollView.mj_contentH - _scrollView.mj_h + self.mj_h * self.triggerAutomaticallyRefreshPercent + _scrollView.mj_insetB - self.mj_h) {
// 防止手松开时连续调用
CGPoint old = [change[@"old"] CGPointValue];
CGPoint new = [change[@"new"] CGPointValue];
if (new.y <= old.y) return;
// 当底部刷新控件完全出现时,才刷新
[self beginRefreshing];
}
}
}
- (void)scrollViewPanStateDidChange:(NSDictionary *)change
{
[super scrollViewPanStateDidChange:change];
if (self.state != MJRefreshStateIdle) return;
if (_scrollView.panGestureRecognizer.state == UIGestureRecognizerStateEnded) {// 手松开
// 屏幕能否全部显示完所有的内容
if (_scrollView.mj_insetT + _scrollView.mj_contentH <= _scrollView.mj_h) { // 不够一个屏幕
NSLog(@"mj_offsetY:%f",_scrollView.mj_offsetY);
NSLog(@"mj_insetT:%f",_scrollView.mj_insetT);
// 只要手松开 && 向上拖拽
if (_scrollView.mj_offsetY >= - _scrollView.mj_insetT) { // 向上拽
[self beginRefreshing];
}
} else {
// 超出一个屏幕
if (_scrollView.mj_offsetY >= _scrollView.mj_contentH + _scrollView.mj_insetB - _scrollView.mj_h) {
NSLog(@"执行刷新");
[self beginRefreshing];
}
}
}
}