123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- //
- // MJRefreshAutoFooter.m
- // MJRefreshExample
- //
- // Created by MJ Lee on 15/4/24.
- // Copyright (c) 2015年 小码哥. All rights reserved.
- //
- #import "MJRefreshAutoFooter.h"
- @interface MJRefreshAutoFooter()
- /** 一个新的拖拽 */
- @property (assign, nonatomic, getter=isOneNewPan) BOOL oneNewPan;
- @end
- @implementation MJRefreshAutoFooter
- #pragma mark - 初始化
- - (void)willMoveToSuperview:(UIView *)newSuperview
- {
- [super willMoveToSuperview:newSuperview];
-
- if (newSuperview) { // 新的父控件
- if (self.hidden == NO) {
- self.scrollView.mj_insetB += self.mj_h;
- }
-
- // 设置位置
- self.mj_y = _scrollView.mj_contentH;
- } else { // 被移除了
- if (self.hidden == NO) {
- self.scrollView.mj_insetB -= self.mj_h;
- }
- }
- }
- #pragma mark - 过期方法
- - (void)setAppearencePercentTriggerAutoRefresh:(CGFloat)appearencePercentTriggerAutoRefresh
- {
- self.triggerAutomaticallyRefreshPercent = appearencePercentTriggerAutoRefresh;
- }
- - (CGFloat)appearencePercentTriggerAutoRefresh
- {
- return self.triggerAutomaticallyRefreshPercent;
- }
- #pragma mark - 实现父类的方法
- - (void)prepare
- {
- [super prepare];
-
- // 默认底部控件100%出现时才会自动刷新
- self.triggerAutomaticallyRefreshPercent = 1.0;
-
- // 设置为默认状态
- self.automaticallyRefresh = YES;
-
- // 默认是当offset达到条件就发送请求(可连续)
- self.onlyRefreshPerDrag = NO;
- }
- - (void)scrollViewContentSizeDidChange:(NSDictionary *)change
- {
- [super scrollViewContentSizeDidChange:change];
-
- // 设置位置
- self.mj_y = self.scrollView.mj_contentH;
- }
- - (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更为合理
- 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;
-
- UIGestureRecognizerState panState = _scrollView.panGestureRecognizer.state;
- if (panState == UIGestureRecognizerStateEnded) {// 手松开
- if (_scrollView.mj_insetT + _scrollView.mj_contentH <= _scrollView.mj_h) { // 不够一个屏幕
- if (_scrollView.mj_offsetY >= - _scrollView.mj_insetT) { // 向上拽
- [self beginRefreshing];
- }
- } else { // 超出一个屏幕
- if (_scrollView.mj_offsetY >= _scrollView.mj_contentH + _scrollView.mj_insetB - _scrollView.mj_h) {
- [self beginRefreshing];
- }
- }
- } else if (panState == UIGestureRecognizerStateBegan) {
- self.oneNewPan = YES;
- }
- }
- - (void)beginRefreshing
- {
- if (!self.isOneNewPan && self.isOnlyRefreshPerDrag) return;
-
- [super beginRefreshing];
-
- self.oneNewPan = NO;
- }
- - (void)setState:(MJRefreshState)state
- {
- MJRefreshCheckState
-
- if (state == MJRefreshStateRefreshing) {
- [self executeRefreshingCallback];
- } else if (state == MJRefreshStateNoMoreData || state == MJRefreshStateIdle) {
- if (MJRefreshStateRefreshing == oldState) {
- if (self.endRefreshingCompletionBlock) {
- self.endRefreshingCompletionBlock();
- }
- }
- }
- }
- - (void)setHidden:(BOOL)hidden
- {
- BOOL lastHidden = self.isHidden;
-
- [super setHidden:hidden];
-
- if (!lastHidden && hidden) {
- self.state = MJRefreshStateIdle;
-
- self.scrollView.mj_insetB -= self.mj_h;
- } else if (lastHidden && !hidden) {
- self.scrollView.mj_insetB += self.mj_h;
-
- // 设置位置
- self.mj_y = _scrollView.mj_contentH;
- }
- }
- @end
|