Skip to content

Commit 43e7570

Browse files
authored
Change the trigger method in AutoFooter. (#1366)
* Change the trigger method in AutoFooter. * delete redundant code
1 parent 72d558c commit 43e7570

File tree

4 files changed

+39
-27
lines changed

4 files changed

+39
-27
lines changed

MJRefresh/Base/MJRefreshAutoFooter.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ NS_ASSUME_NONNULL_BEGIN
2020
/** 当底部控件出现多少时就自动刷新(默认为1.0,也就是底部控件完全出现时,才会自动刷新) */
2121
@property (assign, nonatomic) CGFloat triggerAutomaticallyRefreshPercent;
2222

23-
/** 是否每一次拖拽只发一次请求 */
24-
@property (assign, nonatomic, getter=isOnlyRefreshPerDrag) BOOL onlyRefreshPerDrag;
25-
26-
/** 在触发开始刷新前的刷新忽略逻辑, 默认由 isOnlyRefreshPerDrag 和 新手势决定, 用于特殊控制逻辑, 如果不清楚机制, 请勿使用 */
27-
- (BOOL)ignoreRefreshAction NS_REQUIRES_SUPER;
23+
/** 自动触发次数, 默认为 1, 仅在拖拽 ScrollView 时才生效,
24+
25+
如果为 -1, 则为无限触发
26+
*/
27+
@property (nonatomic) NSInteger autoTriggerTimes;
2828
@end
2929

3030
NS_ASSUME_NONNULL_END

MJRefresh/Base/MJRefreshAutoFooter.m

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010

1111
@interface MJRefreshAutoFooter()
1212
/** 一个新的拖拽 */
13-
@property (assign, nonatomic, getter=isOneNewPan) BOOL oneNewPan;
13+
@property (nonatomic) BOOL triggerByDrag;
14+
@property (nonatomic) NSInteger leftTriggerTimes;
1415
@end
1516

1617
@implementation MJRefreshAutoFooter
@@ -56,8 +57,7 @@ - (void)prepare
5657
// 设置为默认状态
5758
self.automaticallyRefresh = YES;
5859

59-
// 默认是当offset达到条件就发送请求(可连续)
60-
self.onlyRefreshPerDrag = YES;
60+
self.autoTriggerTimes = 1;
6161
}
6262

6363
- (void)scrollViewContentSizeDidChange:(NSDictionary *)change
@@ -82,6 +82,9 @@ - (void)scrollViewContentOffsetDidChange:(NSDictionary *)change
8282
CGPoint new = [change[@"new"] CGPointValue];
8383
if (new.y <= old.y) return;
8484

85+
if (_scrollView.isDragging) {
86+
self.triggerByDrag = YES;
87+
}
8588
// 当底部刷新控件完全出现时,才刷新
8689
[self beginRefreshing];
8790
}
@@ -101,23 +104,20 @@ - (void)scrollViewPanStateDidChange:(NSDictionary *)change
101104
case UIGestureRecognizerStateEnded: {
102105
if (_scrollView.mj_insetT + _scrollView.mj_contentH <= _scrollView.mj_h) { // 不够一个屏幕
103106
if (_scrollView.mj_offsetY >= - _scrollView.mj_insetT) { // 向上拽
107+
self.triggerByDrag = YES;
104108
[self beginRefreshing];
105109
}
106110
} else { // 超出一个屏幕
107111
if (_scrollView.mj_offsetY >= _scrollView.mj_contentH + _scrollView.mj_insetB - _scrollView.mj_h) {
112+
self.triggerByDrag = YES;
108113
[self beginRefreshing];
109114
}
110115
}
111-
}// ‼️注意: 这里没有 break; fallthrough 执行重置 oneNewPan 语句 (Ended & Canceled & Failed)
112-
113-
case UIGestureRecognizerStateCancelled:
114-
case UIGestureRecognizerStateFailed: {
115-
self.oneNewPan = NO;
116116
}
117117
break;
118118

119119
case UIGestureRecognizerStateBegan: {
120-
self.oneNewPan = YES;
120+
[self resetTriggerTimes];
121121
}
122122
break;
123123

@@ -126,13 +126,15 @@ - (void)scrollViewPanStateDidChange:(NSDictionary *)change
126126
}
127127
}
128128

129-
- (BOOL)ignoreRefreshAction {
130-
return !self.isOneNewPan && self.isOnlyRefreshPerDrag;
129+
- (BOOL)unlimitedTrigger {
130+
return self.leftTriggerTimes == -1;
131131
}
132132

133133
- (void)beginRefreshing
134134
{
135-
if ([self ignoreRefreshAction]) return;
135+
if (self.triggerByDrag && self.leftTriggerTimes <= 0 && !self.unlimitedTrigger) {
136+
return;
137+
}
136138

137139
[super beginRefreshing];
138140
}
@@ -144,6 +146,13 @@ - (void)setState:(MJRefreshState)state
144146
if (state == MJRefreshStateRefreshing) {
145147
[self executeRefreshingCallback];
146148
} 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+
147156
if (MJRefreshStateRefreshing == oldState) {
148157
if (self.endRefreshingCompletionBlock) {
149158
self.endRefreshingCompletionBlock();
@@ -152,6 +161,10 @@ - (void)setState:(MJRefreshState)state
152161
}
153162
}
154163

164+
- (void)resetTriggerTimes {
165+
self.leftTriggerTimes = self.autoTriggerTimes;
166+
}
167+
155168
- (void)setHidden:(BOOL)hidden
156169
{
157170
BOOL lastHidden = self.isHidden;
@@ -169,4 +182,9 @@ - (void)setHidden:(BOOL)hidden
169182
self.mj_y = _scrollView.mj_contentH;
170183
}
171184
}
185+
186+
- (void)setAutoTriggerTimes:(NSInteger)autoTriggerTimes {
187+
_autoTriggerTimes = autoTriggerTimes;
188+
self.leftTriggerTimes = autoTriggerTimes;
189+
}
172190
@end

MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ @interface MJRefreshAutoStateFooter()
1515
}
1616
/** 所有状态对应的文字 */
1717
@property (strong, nonatomic) NSMutableDictionary *stateTitles;
18-
/** 用于判断点击 Label 触发特殊的刷新逻辑 */
19-
@property (assign, nonatomic) BOOL labelIsTrigger;
2018
@end
2119

2220
@implementation MJRefreshAutoStateFooter
@@ -45,17 +43,11 @@ - (void)setTitle:(NSString *)title forState:(MJRefreshState)state
4543
self.stateLabel.text = self.stateTitles[@(self.state)];
4644
}
4745

48-
- (BOOL)ignoreRefreshAction {
49-
return !self.labelIsTrigger && [super ignoreRefreshAction];
50-
}
51-
5246
#pragma mark - 私有方法
5347
- (void)stateLabelClick
5448
{
5549
if (self.state == MJRefreshStateIdle) {
56-
self.labelIsTrigger = YES;
5750
[self beginRefreshing];
58-
self.labelIsTrigger = NO;
5951
}
6052
}
6153

MJRefreshExample/Classes/Second/MJTableViewController.m

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,9 @@ - (void)example20
266266
[self example01];
267267

268268
// 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadMoreData方法)
269-
self.tableView.mj_footer = [MJDIYAutoFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
269+
MJDIYAutoFooter *footer = [MJDIYAutoFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
270+
footer.autoTriggerTimes = 2;
271+
self.tableView.mj_footer = footer;
270272
}
271273

272274
#pragma mark UITableView + 上拉刷新 自定义刷新控件(自动回弹)
@@ -302,7 +304,7 @@ - (void)loadNewData
302304
- (void)loadMoreData
303305
{
304306
// 1.添加假数据
305-
for (int i = 0; i<5; i++) {
307+
for (int i = 0; i<1; i++) {
306308
[self.data addObject:MJRandomData];
307309
}
308310

0 commit comments

Comments
 (0)