Sfoglia il codice sorgente

Change the trigger method in AutoFooter. (#1366)

* Change the trigger method in AutoFooter.

* delete redundant code
Frank 6 anni fa
parent
commit
43e7570dc7

+ 5 - 5
MJRefresh/Base/MJRefreshAutoFooter.h

@@ -20,11 +20,11 @@ NS_ASSUME_NONNULL_BEGIN
 /** 当底部控件出现多少时就自动刷新(默认为1.0,也就是底部控件完全出现时,才会自动刷新) */
 @property (assign, nonatomic) CGFloat triggerAutomaticallyRefreshPercent;
 
-/** 是否每一次拖拽只发一次请求 */
-@property (assign, nonatomic, getter=isOnlyRefreshPerDrag) BOOL onlyRefreshPerDrag;
-
-/** 在触发开始刷新前的刷新忽略逻辑, 默认由 isOnlyRefreshPerDrag 和 新手势决定, 用于特殊控制逻辑, 如果不清楚机制, 请勿使用 */
-- (BOOL)ignoreRefreshAction NS_REQUIRES_SUPER;
+/** 自动触发次数, 默认为 1, 仅在拖拽 ScrollView 时才生效,
+ 
+ 如果为 -1, 则为无限触发
+ */
+@property (nonatomic) NSInteger autoTriggerTimes;
 @end
 
 NS_ASSUME_NONNULL_END

+ 30 - 12
MJRefresh/Base/MJRefreshAutoFooter.m

@@ -10,7 +10,8 @@
 
 @interface MJRefreshAutoFooter()
 /** 一个新的拖拽 */
-@property (assign, nonatomic, getter=isOneNewPan) BOOL oneNewPan;
+@property (nonatomic) BOOL triggerByDrag;
+@property (nonatomic) NSInteger leftTriggerTimes;
 @end
 
 @implementation MJRefreshAutoFooter
@@ -56,8 +57,7 @@ - (void)prepare
     // 设置为默认状态
     self.automaticallyRefresh = YES;
     
-    // 默认是当offset达到条件就发送请求(可连续)
-    self.onlyRefreshPerDrag = YES;
+    self.autoTriggerTimes = 1;
 }
 
 - (void)scrollViewContentSizeDidChange:(NSDictionary *)change
@@ -82,6 +82,9 @@ - (void)scrollViewContentOffsetDidChange:(NSDictionary *)change
             CGPoint new = [change[@"new"] CGPointValue];
             if (new.y <= old.y) return;
             
+            if (_scrollView.isDragging) {
+                self.triggerByDrag = YES;
+            }
             // 当底部刷新控件完全出现时,才刷新
             [self beginRefreshing];
         }
@@ -101,23 +104,20 @@ - (void)scrollViewPanStateDidChange:(NSDictionary *)change
         case UIGestureRecognizerStateEnded: {
             if (_scrollView.mj_insetT + _scrollView.mj_contentH <= _scrollView.mj_h) {  // 不够一个屏幕
                 if (_scrollView.mj_offsetY >= - _scrollView.mj_insetT) { // 向上拽
+                    self.triggerByDrag = YES;
                     [self beginRefreshing];
                 }
             } else { // 超出一个屏幕
                 if (_scrollView.mj_offsetY >= _scrollView.mj_contentH + _scrollView.mj_insetB - _scrollView.mj_h) {
+                    self.triggerByDrag = YES;
                     [self beginRefreshing];
                 }
             }
-        }// ‼️注意: 这里没有 break; fallthrough 执行重置 oneNewPan 语句 (Ended & Canceled & Failed)
-            
-        case UIGestureRecognizerStateCancelled:
-        case UIGestureRecognizerStateFailed: {
-            self.oneNewPan = NO;
         }
             break;
             
         case UIGestureRecognizerStateBegan: {
-            self.oneNewPan = YES;
+            [self resetTriggerTimes];
         }
             break;
             
@@ -126,13 +126,15 @@ - (void)scrollViewPanStateDidChange:(NSDictionary *)change
     }
 }
 
-- (BOOL)ignoreRefreshAction {
-    return !self.isOneNewPan && self.isOnlyRefreshPerDrag;
+- (BOOL)unlimitedTrigger {
+    return self.leftTriggerTimes == -1;
 }
 
 - (void)beginRefreshing
 {
-    if ([self ignoreRefreshAction]) return;
+    if (self.triggerByDrag && self.leftTriggerTimes <= 0 && !self.unlimitedTrigger) {
+        return;
+    }
     
     [super beginRefreshing];
 }
@@ -144,6 +146,13 @@ - (void)setState:(MJRefreshState)state
     if (state == MJRefreshStateRefreshing) {
         [self executeRefreshingCallback];
     } else if (state == MJRefreshStateNoMoreData || state == MJRefreshStateIdle) {
+        if (self.triggerByDrag) {
+            if (!self.unlimitedTrigger) {
+                self.leftTriggerTimes -= 1;
+            }
+            self.triggerByDrag = NO;
+        }
+        
         if (MJRefreshStateRefreshing == oldState) {
             if (self.endRefreshingCompletionBlock) {
                 self.endRefreshingCompletionBlock();
@@ -152,6 +161,10 @@ - (void)setState:(MJRefreshState)state
     }
 }
 
+- (void)resetTriggerTimes {
+    self.leftTriggerTimes = self.autoTriggerTimes;
+}
+
 - (void)setHidden:(BOOL)hidden
 {
     BOOL lastHidden = self.isHidden;
@@ -169,4 +182,9 @@ - (void)setHidden:(BOOL)hidden
         self.mj_y = _scrollView.mj_contentH;
     }
 }
+
+- (void)setAutoTriggerTimes:(NSInteger)autoTriggerTimes {
+    _autoTriggerTimes = autoTriggerTimes;
+    self.leftTriggerTimes = autoTriggerTimes;
+}
 @end

+ 0 - 8
MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m

@@ -15,8 +15,6 @@ @interface MJRefreshAutoStateFooter()
 }
 /** 所有状态对应的文字 */
 @property (strong, nonatomic) NSMutableDictionary *stateTitles;
-/** 用于判断点击 Label 触发特殊的刷新逻辑 */
-@property (assign, nonatomic) BOOL labelIsTrigger;
 @end
 
 @implementation MJRefreshAutoStateFooter
@@ -45,17 +43,11 @@ - (void)setTitle:(NSString *)title forState:(MJRefreshState)state
     self.stateLabel.text = self.stateTitles[@(self.state)];
 }
 
-- (BOOL)ignoreRefreshAction {
-    return !self.labelIsTrigger && [super ignoreRefreshAction];
-}
-
 #pragma mark - 私有方法
 - (void)stateLabelClick
 {
     if (self.state == MJRefreshStateIdle) {
-        self.labelIsTrigger = YES;
         [self beginRefreshing];
-        self.labelIsTrigger = NO;
     }
 }
 

+ 4 - 2
MJRefreshExample/Classes/Second/MJTableViewController.m

@@ -266,7 +266,9 @@ - (void)example20
     [self example01];
     
     // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
-    self.tableView.mj_footer = [MJDIYAutoFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
+    MJDIYAutoFooter *footer = [MJDIYAutoFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
+    footer.autoTriggerTimes = 2;
+    self.tableView.mj_footer = footer;
 }
 
 #pragma mark UITableView + 上拉刷新 自定义刷新控件(自动回弹)
@@ -302,7 +304,7 @@ - (void)loadNewData
 - (void)loadMoreData
 {
     // 1.添加假数据
-    for (int i = 0; i<5; i++) {
+    for (int i = 0; i<1; i++) {
         [self.data addObject:MJRandomData];
     }