10
10
11
11
@interface MJRefreshAutoFooter ()
12
12
/* * 一个新的拖拽 */
13
- @property (assign , nonatomic , getter =isOneNewPan) BOOL oneNewPan;
13
+ @property (nonatomic ) BOOL triggerByDrag;
14
+ @property (nonatomic ) NSInteger leftTriggerTimes;
14
15
@end
15
16
16
17
@implementation MJRefreshAutoFooter
@@ -56,8 +57,7 @@ - (void)prepare
56
57
// 设置为默认状态
57
58
self.automaticallyRefresh = YES ;
58
59
59
- // 默认是当offset达到条件就发送请求(可连续)
60
- self.onlyRefreshPerDrag = YES ;
60
+ self.autoTriggerTimes = 1 ;
61
61
}
62
62
63
63
- (void )scrollViewContentSizeDidChange : (NSDictionary *)change
@@ -82,6 +82,9 @@ - (void)scrollViewContentOffsetDidChange:(NSDictionary *)change
82
82
CGPoint new = [change[@" new" ] CGPointValue ];
83
83
if (new.y <= old.y ) return ;
84
84
85
+ if (_scrollView.isDragging ) {
86
+ self.triggerByDrag = YES ;
87
+ }
85
88
// 当底部刷新控件完全出现时,才刷新
86
89
[self beginRefreshing ];
87
90
}
@@ -101,23 +104,20 @@ - (void)scrollViewPanStateDidChange:(NSDictionary *)change
101
104
case UIGestureRecognizerStateEnded: {
102
105
if (_scrollView.mj_insetT + _scrollView.mj_contentH <= _scrollView.mj_h ) { // 不够一个屏幕
103
106
if (_scrollView.mj_offsetY >= - _scrollView.mj_insetT ) { // 向上拽
107
+ self.triggerByDrag = YES ;
104
108
[self beginRefreshing ];
105
109
}
106
110
} else { // 超出一个屏幕
107
111
if (_scrollView.mj_offsetY >= _scrollView.mj_contentH + _scrollView.mj_insetB - _scrollView.mj_h ) {
112
+ self.triggerByDrag = YES ;
108
113
[self beginRefreshing ];
109
114
}
110
115
}
111
- }// ‼️注意: 这里没有 break; fallthrough 执行重置 oneNewPan 语句 (Ended & Canceled & Failed)
112
-
113
- case UIGestureRecognizerStateCancelled:
114
- case UIGestureRecognizerStateFailed: {
115
- self.oneNewPan = NO ;
116
116
}
117
117
break ;
118
118
119
119
case UIGestureRecognizerStateBegan: {
120
- self. oneNewPan = YES ;
120
+ [ self resetTriggerTimes ] ;
121
121
}
122
122
break ;
123
123
@@ -126,13 +126,15 @@ - (void)scrollViewPanStateDidChange:(NSDictionary *)change
126
126
}
127
127
}
128
128
129
- - (BOOL )ignoreRefreshAction {
130
- return ! self.isOneNewPan && self. isOnlyRefreshPerDrag ;
129
+ - (BOOL )unlimitedTrigger {
130
+ return self.leftTriggerTimes == - 1 ;
131
131
}
132
132
133
133
- (void )beginRefreshing
134
134
{
135
- if ([self ignoreRefreshAction ]) return ;
135
+ if (self.triggerByDrag && self.leftTriggerTimes <= 0 && !self.unlimitedTrigger ) {
136
+ return ;
137
+ }
136
138
137
139
[super beginRefreshing ];
138
140
}
@@ -144,6 +146,13 @@ - (void)setState:(MJRefreshState)state
144
146
if (state == MJRefreshStateRefreshing) {
145
147
[self executeRefreshingCallback ];
146
148
} else if (state == MJRefreshStateNoMoreData || state == MJRefreshStateIdle) {
149
+ if (self.triggerByDrag ) {
150
+ if (!self.unlimitedTrigger ) {
151
+ self.leftTriggerTimes -= 1 ;
152
+ }
153
+ self.triggerByDrag = NO ;
154
+ }
155
+
147
156
if (MJRefreshStateRefreshing == oldState) {
148
157
if (self.endRefreshingCompletionBlock ) {
149
158
self.endRefreshingCompletionBlock ();
@@ -152,6 +161,10 @@ - (void)setState:(MJRefreshState)state
152
161
}
153
162
}
154
163
164
+ - (void )resetTriggerTimes {
165
+ self.leftTriggerTimes = self.autoTriggerTimes ;
166
+ }
167
+
155
168
- (void )setHidden : (BOOL )hidden
156
169
{
157
170
BOOL lastHidden = self.isHidden ;
@@ -169,4 +182,9 @@ - (void)setHidden:(BOOL)hidden
169
182
self.mj_y = _scrollView.mj_contentH ;
170
183
}
171
184
}
185
+
186
+ - (void )setAutoTriggerTimes : (NSInteger )autoTriggerTimes {
187
+ _autoTriggerTimes = autoTriggerTimes;
188
+ self.leftTriggerTimes = autoTriggerTimes;
189
+ }
172
190
@end
0 commit comments