MJRefresh源码分析之上拉加载

由于上一篇文章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];
                
                
            }
        }
    }
}

你可能感兴趣的:(MJRefresh源码分析之上拉加载)