清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
//改变MJ文件中的MJRefreshBackFooter.h 文件 //改变此文件中的几行代码即可实现 //共改两处 // 下面的是MJRefreshBackFooter.m文件 #import "MJRefreshBackFooter.h" @interface MJRefreshBackFooter() @property (assign, nonatomic) NSInteger lastRefreshCount; @property (assign, nonatomic) CGFloat lastBottomDelta; @end @implementation MJRefreshBackFooter #pragma mark - 实现父类的方法 - (void)scrollViewContentOffsetDidChange:(NSDictionary *)change { [super scrollViewContentOffsetDidChange:change]; // 如果正在刷新,直接返回 if (self.state == MJRefreshStateRefreshing || self.state == MJRefreshStateNoMoreData) return; _scrollViewOriginalInset = self.scrollView.contentInset; // 当前的contentOffset CGFloat currentOffsetY = self.scrollView.mj_offsetY; // 尾部控件刚好出现的offsetY CGFloat happenOffsetY = [self happenOffsetY]; // 如果是向下滚动到看不见尾部控件,直接返回 if (currentOffsetY <= happenOffsetY) return; CGFloat pullingPercent = (currentOffsetY - happenOffsetY) / self.mj_h; if (self.scrollView.isDragging) { self.pullingPercent = pullingPercent; #pragma mark- 下面注释掉得是MJ原来的代码 // 普通 和 即将刷新 的临界点 // CGFloat normal2pullingOffsetY = happenOffsetY + self.mj_h; [self beginRefreshing]; // if (self.state == MJRefreshStateIdle && currentOffsetY > normal2pullingOffsetY) { // // 转为即将刷新状态 // self.state = MJRefreshStatePulling; // } else if (self.state == MJRefreshStatePulling && currentOffsetY <= normal2pullingOffsetY) { // // 转为普通状态 // self.state = MJRefreshStateIdle; // } } else if (self.state == MJRefreshStatePulling) {// 即将刷新 && 手松开 // 开始刷新 [self beginRefreshing]; } else if (pullingPercent < 1) { self.pullingPercent = pullingPercent; } } - (void)scrollViewContentSizeDidChange:(NSDictionary *)change { [super scrollViewContentSizeDidChange:change]; // 内容的高度 CGFloat contentHeight = self.scrollView.mj_contentH; // 表格的高度 CGFloat scrollHeight = self.scrollView.mj_h - self.scrollViewOriginalInset.top - self.scrollViewOriginalInset.bottom; // 这里一定是用:self.scrollView.mj_insetT 和 self.scrollViewOriginalInset.bottom; // 设置位置和尺寸 self.mj_y = MAX(contentHeight, scrollHeight); } - (void)setState:(MJRefreshState)state { MJRefreshCheckState // 根据状态来设置属性 if (state == MJRefreshStateNoMoreData || state == MJRefreshStateIdle) { // 刷新完毕 if (MJRefreshStateRefreshing == oldState) { [UIView animateWithDuration:MJRefreshSlowAnimationDuration animations:^{ self.scrollView.mj_insetB -= self.lastBottomDelta; // 自动调整透明度 if (self.isAutoChangeAlpha) self.alpha = 0.0; } completion:^(BOOL finished) { self.pullingPercent = 0.0; }]; } CGFloat deltaH = [self heightForContentBreakView]; NSInteger currentCount = [self totalDataCountInScrollView]; // 刚刷新完毕 if (MJRefreshStateRefreshing == oldState && deltaH > 0 && currentCount != self.lastRefreshCount) { self.scrollView.mj_offsetY = self.scrollView.mj_offsetY; } } else if (state == MJRefreshStateRefreshing) { // 记录刷新前的数量 self.lastRefreshCount = [self totalDataCountInScrollView]; [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ CGFloat bottom = self.mj_h + self.scrollViewOriginalInset.bottom; CGFloat deltaH = [self heightForContentBreakView]; if (deltaH < 0) { // 如果内容高度小于view的高度 bottom -= deltaH; } self.lastBottomDelta = bottom - self.scrollView.mj_insetB; self.scrollView.mj_insetB = bottom; #warning 上拉刷新 #pragma mark- 下面注释掉得是MJ原来的代码 原本加的是self.mj_h 改为0 self.scrollView.mj_offsetY = [self happenOffsetY] +0;// self.mj_h; } completion:^(BOOL finished) { [self executeRefreshingCallback]; }]; } } #pragma mark - 公共方法 - (void)endRefreshing { if ([self.scrollView isKindOfClass:[UICollectionView class]]) { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [super endRefreshing]; }); } else { [super endRefreshing]; } } #pragma mark - 私有方法 #pragma mark 获得scrollView的内容 超出 view 的高度 - (CGFloat)heightForContentBreakView { CGFloat h = self.scrollView.frame.size.height - self.scrollViewOriginalInset.bottom - self.scrollViewOriginalInset.top; return self.scrollView.contentSize.height - h; } #pragma mark 刚好看到上拉刷新控件时的contentOffset.y - (CGFloat)happenOffsetY { CGFloat deltaH = [self heightForContentBreakView]; if (deltaH > 0) { return deltaH - self.scrollViewOriginalInset.top; } else { return - self.scrollViewOriginalInset.top; } } - (NSInteger)totalDataCountInScrollView { NSInteger totalCount = 0; if ([self.scrollView isKindOfClass:[UITableView class]]) { UITableView *tableView = (UITableView *)self.scrollView; for (NSInteger section = 0; section<tableView.numberOfSections; section++) { totalCount += [tableView numberOfRowsInSection:section]; } } else if ([self.scrollView isKindOfClass:[UICollectionView class]]) { UICollectionView *collectionView = (UICollectionView *)self.scrollView; for (NSInteger section = 0; section<collectionView.numberOfSections; section++) { totalCount += [collectionView numberOfItemsInSection:section]; } } return totalCount; } @end