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];
                
                
            }
        }
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,901评论 25 709
  • MJRefresh是李明杰老师的作品,到现在已经有9800多颗star了,是一个简单实用,功能强大的iOS下拉刷新...
    Style_mao阅读 3,897评论 1 2
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,338评论 4 61
  • 最近跟一些做社群的朋友交流时,有些人总在纠结是要先花精力去引流还是先花精力创作更优质的内容,因为他们有些人认为有了...
    零叫兽阅读 1,527评论 0 1
  • 【日精进打卡第06天】 【知~学习】 《六项精进》0遍 共8遍 《大学》0遍 共8遍 【经典名句分享】 天行健,君...
    天空_becb阅读 1,274评论 0 0