From 812aace08fa242620f09b0d52ee4aa4cd38d08b3 Mon Sep 17 00:00:00 2001 From: carroll chen Date: Thu, 11 Jun 2020 17:02:26 +0800 Subject: [PATCH 1/4] MJRefreshHeader's resetInset bug for section header pinned & device rotation --- MJRefresh/Base/MJRefreshHeader.m | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/MJRefresh/Base/MJRefreshHeader.m b/MJRefresh/Base/MJRefreshHeader.m index 207992ab..c348142f 100644 --- a/MJRefresh/Base/MJRefreshHeader.m +++ b/MJRefresh/Base/MJRefreshHeader.m @@ -59,12 +59,13 @@ - (void)resetInset { } // sectionheader停留解决 - CGFloat insetT = - self.scrollView.mj_offsetY > _scrollViewOriginalInset.top ? - self.scrollView.mj_offsetY : _scrollViewOriginalInset.top; - insetT = insetT > self.mj_h + _scrollViewOriginalInset.top ? self.mj_h + _scrollViewOriginalInset.top : insetT; - self.insetTDelta = _scrollViewOriginalInset.top - insetT; - // 避免 CollectionView 在使用根据 Autolayout 和 内容自动伸缩 Cell, 刷新时导致的 Layout 异常渲染问题 - if (self.scrollView.mj_insetT != insetT) { - self.scrollView.mj_insetT = insetT; + CGFloat systemTop = self.scrollView.mj_insetT - self.insetTDelta; + CGFloat delta = -systemTop - self.scrollView.mj_offsetY; + delta = delta < 0.f ? 0 : MIN(delta, self.mj_h); + if (delta >= 0 && delta != self.insetTDelta) { + CGFloat adjust = delta - self.insetTDelta; + self.insetTDelta = delta; + self.scrollView.mj_insetT += adjust; } } @@ -72,15 +73,15 @@ - (void)scrollViewContentOffsetDidChange:(NSDictionary *)change { [super scrollViewContentOffsetDidChange:change]; + // 跳转到下一个控制器时,contentInset可能会变 + _scrollViewOriginalInset = self.scrollView.mj_inset; + // 在刷新的refreshing状态 if (self.state == MJRefreshStateRefreshing) { [self resetInset]; return; } - // 跳转到下一个控制器时,contentInset可能会变 - _scrollViewOriginalInset = self.scrollView.mj_inset; - // 当前的contentOffset CGFloat offsetY = self.scrollView.mj_offsetY; // 头部控件刚好出现的offsetY @@ -134,8 +135,8 @@ - (void)headerEndingAction { if (!self.isCollectionViewAnimationBug) { // 恢复inset和offset [UIView animateWithDuration:MJRefreshSlowAnimationDuration animations:^{ - self.scrollView.mj_insetT += self.insetTDelta; - + self.scrollView.mj_insetT -= self.insetTDelta; + self.insetTDelta = 0.f; if (self.endRefreshingAnimationBeginAction) { self.endRefreshingAnimationBeginAction(); } @@ -207,6 +208,7 @@ - (void)headerRefreshingAction { CGFloat top = self.scrollViewOriginalInset.top + self.mj_h; // 增加滚动区域top self.scrollView.mj_insetT = top; + self.insetTDelta = self.mj_h; // 设置滚动位置 CGPoint offset = self.scrollView.contentOffset; offset.y = -top; From 78c445bc5a076070bf4b21c1aa21b2bf230fa24c Mon Sep 17 00:00:00 2001 From: carroll chen Date: Sat, 13 Jun 2020 12:44:02 +0800 Subject: [PATCH 2/4] adapter case of isCollectionViewAnimationBug = YES --- MJRefresh/Base/MJRefreshHeader.m | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/MJRefresh/Base/MJRefreshHeader.m b/MJRefresh/Base/MJRefreshHeader.m index c348142f..45d75766 100644 --- a/MJRefresh/Base/MJRefreshHeader.m +++ b/MJRefresh/Base/MJRefreshHeader.m @@ -35,7 +35,6 @@ + (instancetype)headerWithRefreshingTarget:(id)target refreshingAction:(SEL)acti - (void)prepare { [super prepare]; - // 设置key self.lastUpdatedTimeKey = MJRefreshHeaderLastUpdatedTimeKey; @@ -59,13 +58,15 @@ - (void)resetInset { } // sectionheader停留解决 - CGFloat systemTop = self.scrollView.mj_insetT - self.insetTDelta; - CGFloat delta = -systemTop - self.scrollView.mj_offsetY; - delta = delta < 0.f ? 0 : MIN(delta, self.mj_h); - if (delta >= 0 && delta != self.insetTDelta) { - CGFloat adjust = delta - self.insetTDelta; - self.insetTDelta = delta; - self.scrollView.mj_insetT += adjust; + if (self.scrollView.isUserInteractionEnabled) { + CGFloat systemTop = self.scrollView.mj_insetT - self.insetTDelta; + CGFloat delta = -systemTop - self.scrollView.mj_offsetY; + delta = delta < 0.f ? 0 : MIN(delta, self.mj_h); + if (delta >= 0 && delta != self.insetTDelta) { + CGFloat adjust = delta - self.insetTDelta; + self.insetTDelta = delta; + self.scrollView.mj_insetT += adjust; + } } } @@ -165,13 +166,13 @@ - (void)headerEndingAction { // 由于修改 Inset 会导致 self.pullingPercent 联动设置 self.alpha, 故提前获取 alpha 值, 后续用于还原 alpha 动画 CGFloat viewAlpha = self.alpha; - self.scrollView.mj_insetT += self.insetTDelta; + self.scrollView.mj_insetT -= self.insetTDelta; // 禁用交互, 如果不禁用可能会引起渲染问题. self.scrollView.userInteractionEnabled = NO; //CAAnimation keyPath 不支持 contentInset 用Bounds的动画代替 CABasicAnimation *boundsAnimation = [CABasicAnimation animationWithKeyPath:@"bounds"]; - boundsAnimation.fromValue = [NSValue valueWithCGRect:CGRectOffset(self.scrollView.bounds, 0, self.insetTDelta)]; + boundsAnimation.fromValue = [NSValue valueWithCGRect:CGRectOffset(self.scrollView.bounds, 0, -self.insetTDelta)]; boundsAnimation.duration = MJRefreshSlowAnimationDuration; //在delegate里移除 boundsAnimation.removedOnCompletion = NO; @@ -250,6 +251,7 @@ - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { NSString *identity = [anim valueForKey:@"identity"]; if ([identity isEqualToString:MJRefreshHeaderRefreshing2IdleBoundsKey]) { self.pullingPercent = 0.0; + self.insetTDelta = 0.f; self.scrollView.userInteractionEnabled = YES; if (self.endRefreshingCompletionBlock) { self.endRefreshingCompletionBlock(); @@ -258,6 +260,7 @@ - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { // 避免出现 end 先于 Refreshing 状态 if (self.state != MJRefreshStateIdle) { CGFloat top = self.scrollViewOriginalInset.top + self.mj_h; + self.insetTDelta = self.mj_h; self.scrollView.mj_insetT = top; // 设置最终滚动位置 CGPoint offset = self.scrollView.contentOffset; From bf2d04410c00ed0003b207d037f08d9abca22b7b Mon Sep 17 00:00:00 2001 From: carroll chen Date: Sat, 13 Jun 2020 13:03:10 +0800 Subject: [PATCH 3/4] recover unmeaning changed code --- MJRefresh/Base/MJRefreshHeader.m | 1 + 1 file changed, 1 insertion(+) diff --git a/MJRefresh/Base/MJRefreshHeader.m b/MJRefresh/Base/MJRefreshHeader.m index 45d75766..80f9f155 100644 --- a/MJRefresh/Base/MJRefreshHeader.m +++ b/MJRefresh/Base/MJRefreshHeader.m @@ -35,6 +35,7 @@ + (instancetype)headerWithRefreshingTarget:(id)target refreshingAction:(SEL)acti - (void)prepare { [super prepare]; + // 设置key self.lastUpdatedTimeKey = MJRefreshHeaderLastUpdatedTimeKey; From fe0e485dde8d1f66e7c0a9e4d11df6b8e1c4cd43 Mon Sep 17 00:00:00 2001 From: carroll chen Date: Mon, 15 Jun 2020 15:18:51 +0800 Subject: [PATCH 4/4] fixed device orientation bug --- MJRefresh/Base/MJRefreshHeader.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MJRefresh/Base/MJRefreshHeader.m b/MJRefresh/Base/MJRefreshHeader.m index 80f9f155..a8894a26 100644 --- a/MJRefresh/Base/MJRefreshHeader.m +++ b/MJRefresh/Base/MJRefreshHeader.m @@ -59,7 +59,7 @@ - (void)resetInset { } // sectionheader停留解决 - if (self.scrollView.isUserInteractionEnabled) { + if (self.scrollView.isUserInteractionEnabled && (self.scrollView.isTracking || self.scrollView.isDecelerating)) { CGFloat systemTop = self.scrollView.mj_insetT - self.insetTDelta; CGFloat delta = -systemTop - self.scrollView.mj_offsetY; delta = delta < 0.f ? 0 : MIN(delta, self.mj_h);