From 11a0ee50210a68d320ee03cd623b8327735f1703 Mon Sep 17 00:00:00 2001 From: wwwcg Date: Thu, 31 Oct 2024 22:14:58 +0800 Subject: [PATCH] fix(ios): abnormal onFooterPulling callback (#4106) --- .../footerrefresh/HippyFooterRefresh.m | 35 ++++++++++--------- .../headerrefresh/HippyHeaderRefresh.m | 31 ++++++++-------- .../renderer/component/refresh/HippyRefresh.h | 8 +++-- .../renderer/component/refresh/HippyRefresh.m | 6 ++-- .../waterfalllist/HippyWaterfallView.mm | 8 ++--- 5 files changed, 50 insertions(+), 38 deletions(-) diff --git a/renderer/native/ios/renderer/component/footerrefresh/HippyFooterRefresh.m b/renderer/native/ios/renderer/component/footerrefresh/HippyFooterRefresh.m index cb8cf19c589..02bbc7c0537 100644 --- a/renderer/native/ios/renderer/component/footerrefresh/HippyFooterRefresh.m +++ b/renderer/native/ios/renderer/component/footerrefresh/HippyFooterRefresh.m @@ -22,15 +22,18 @@ #import "HippyFooterRefresh.h" +static NSString *const kContentSizeKey = @"contentSize"; +static NSString *const kContentOffsetParamKey = @"contentOffset"; + @implementation HippyFooterRefresh - (void)setScrollView:(UIScrollView *)scrollView { [super setScrollView:scrollView]; - [scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:NULL]; + [scrollView addObserver:self forKeyPath:kContentSizeKey options:NSKeyValueObservingOptionNew context:NULL]; } - (void)unsetFromScrollView { - [_scrollView removeObserver:self forKeyPath:@"contentSize"]; + [_scrollView removeObserver:self forKeyPath:kContentSizeKey]; [super unsetFromScrollView]; } @@ -38,30 +41,30 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { - if ([keyPath isEqualToString:@"contentSize"]) { + if ([keyPath isEqualToString:kContentSizeKey]) { NSValue *sizeValue = change[@"new"]; CGSize size = [sizeValue CGSizeValue]; self.frame = CGRectMake(0, size.height, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds)); } } -- (void)scrollViewDidScroll { - if (_scrollView && _scrollView.contentSize.height > 0) { - if (self.onFooterPulling && HippyRefreshStatusStartLoading != [self status] && HippyRefreshStatusFinishLoading != [self status]) { - CGFloat offset = _scrollView.contentOffset.y; - if (offset >= 0) { - self.onFooterPulling(@{ @"contentOffset": @(offset) }); +- (void)scrollViewDidScroll:(UIScrollView *)scrollView { + CGFloat contentSizeHeight = scrollView.contentSize.height; + if (self.onFooterPulling && contentSizeHeight > 0) { + if (HippyRefreshStatusStartLoading != [self status] && + HippyRefreshStatusFinishLoading != [self status]) { + CGFloat offset = scrollView.contentOffset.y; + if (offset >= (contentSizeHeight - CGRectGetHeight(scrollView.bounds))) { + self.onFooterPulling(@{ kContentOffsetParamKey : @(offset) }); } } } } -- (void)scrollViewDidEndDragging { - if (_scrollView) { - CGFloat offset = _scrollView.contentOffset.y; - if (offset > _scrollView.contentSize.height - CGRectGetHeight(_scrollView.bounds) + CGRectGetHeight(self.bounds)) { - self.status = HippyRefreshStatusStartLoading; - } +- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView { + CGFloat offset = scrollView.contentOffset.y; + if (offset >= scrollView.contentSize.height - CGRectGetHeight(scrollView.bounds) + CGRectGetHeight(self.bounds)) { + self.status = HippyRefreshStatusStartLoading; } } @@ -90,7 +93,7 @@ - (void)setStatus:(HippyRefreshStatus)status { } completion:^(BOOL finished) { if (self.onFooterReleased) { CGFloat offset = self.scrollView.contentOffset.y; - self.onFooterReleased(@{@"contentOffset": @(offset)}); + self.onFooterReleased(@{ kContentOffsetParamKey : @(offset) }); } }]; } break; diff --git a/renderer/native/ios/renderer/component/headerrefresh/HippyHeaderRefresh.m b/renderer/native/ios/renderer/component/headerrefresh/HippyHeaderRefresh.m index 2f99987d4fb..565e65ebffb 100644 --- a/renderer/native/ios/renderer/component/headerrefresh/HippyHeaderRefresh.m +++ b/renderer/native/ios/renderer/component/headerrefresh/HippyHeaderRefresh.m @@ -22,6 +22,8 @@ #import "HippyHeaderRefresh.h" +static NSString *const kContentOffsetParamKey = @"contentOffset"; + @implementation HippyHeaderRefresh - (void)setFrame:(CGRect)frame { @@ -34,23 +36,24 @@ - (void)setFrame:(CGRect)frame { [super setFrame:properFrame]; } -- (void)scrollViewDidScroll { - if (_scrollView) { - if (self.onHeaderPulling && HippyRefreshStatusStartLoading != [self status] && HippyRefreshStatusFinishLoading != [self status]) { - CGFloat offset = _scrollView.contentOffset.y; - if (offset <= 0) { - self.onHeaderPulling(@{ @"contentOffset": @(-offset) }); - } +- (void)scrollViewDidScroll:(UIScrollView *)scrollView { + if (self.onHeaderPulling && + HippyRefreshStatusStartLoading != [self status] && + HippyRefreshStatusFinishLoading != [self status]) { + CGFloat offset = scrollView.contentOffset.y; + if (offset <= 0) { + self.onHeaderPulling(@{ kContentOffsetParamKey : @(-offset) }); } } - // Section cell will stick in wrong position while header is still refresh. in this scenarioļ¼Œthe scrollview inset need to be reset. - if ([self status] == HippyRefreshStatusStartLoading || [self status] == HippyRefreshStatusFinishLoading) { + // Section cell will stick in wrong position while header is still refresh. + // in this scenarioļ¼Œthe scrollview inset need to be reset. + if ([self status] == HippyRefreshStatusStartLoading || + [self status] == HippyRefreshStatusFinishLoading) { [self resetInset]; } } -- (void)resetInset -{ +- (void)resetInset { CGFloat insetT = - self.scrollView.contentOffset.y > 0 ? - self.scrollView.contentOffset.y : 0; insetT = insetT > self.frame.size.height ? self.frame.size.height : insetT; @@ -69,8 +72,8 @@ - (void)refresh { }]; } -- (void)scrollViewDidEndDragging { - if (_scrollView && -_scrollView.contentOffset.y > CGRectGetHeight(self.bounds)) { +- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView { + if (scrollView && -scrollView.contentOffset.y > CGRectGetHeight(self.bounds)) { self.status = HippyRefreshStatusStartLoading; } } @@ -95,7 +98,7 @@ - (void)setStatus:(HippyRefreshStatus)status { } completion:^(BOOL finished) { if (self.onHeaderReleased) { CGFloat offset = self.scrollView.contentOffset.y; - self.onHeaderReleased(@{@"contentOffset": @(offset)}); + self.onHeaderReleased(@{ kContentOffsetParamKey : @(offset) }); } }]; } break; diff --git a/renderer/native/ios/renderer/component/refresh/HippyRefresh.h b/renderer/native/ios/renderer/component/refresh/HippyRefresh.h index 2e68fe2f315..85b00a2b2b3 100644 --- a/renderer/native/ios/renderer/component/refresh/HippyRefresh.h +++ b/renderer/native/ios/renderer/component/refresh/HippyRefresh.h @@ -55,8 +55,12 @@ typedef NS_ENUM(NSUInteger, HippyRefreshStatus) { - (void)unsetFromScrollView; -- (void)scrollViewDidEndDragging; -- (void)scrollViewDidScroll; +/// Called when UIScrollView's scrollViewDidEndDragging triggers +- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView; + +/// Called when UIScrollView's scrollViewDidScroll triggers +/// - Parameter scrollView: UIScrollView +- (void)scrollViewDidScroll:(UIScrollView *)scrollView; - (void)refresh; - (void)refreshFinish; diff --git a/renderer/native/ios/renderer/component/refresh/HippyRefresh.m b/renderer/native/ios/renderer/component/refresh/HippyRefresh.m index 02cff2b8009..36af9e0373f 100644 --- a/renderer/native/ios/renderer/component/refresh/HippyRefresh.m +++ b/renderer/native/ios/renderer/component/refresh/HippyRefresh.m @@ -34,10 +34,12 @@ - (void)unsetFromScrollView { [self removeFromSuperview]; } -- (void)scrollViewDidScroll { +- (void)scrollViewDidScroll:(UIScrollView *)scrollView { + // nop } -- (void)scrollViewDidEndDragging { +- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView { + //nop } - (void)setStatus:(HippyRefreshStatus)status { diff --git a/renderer/native/ios/renderer/component/waterfalllist/HippyWaterfallView.mm b/renderer/native/ios/renderer/component/waterfalllist/HippyWaterfallView.mm index 902d8304353..e95500f7efc 100644 --- a/renderer/native/ios/renderer/component/waterfalllist/HippyWaterfallView.mm +++ b/renderer/native/ios/renderer/component/waterfalllist/HippyWaterfallView.mm @@ -417,8 +417,8 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView { [scrollViewListener scrollViewDidScroll:scrollView]; } } - [_headerRefreshView scrollViewDidScroll]; - [_footerRefreshView scrollViewDidScroll]; + [_headerRefreshView scrollViewDidScroll:scrollView]; + [_footerRefreshView scrollViewDidScroll:scrollView]; } - (NSDictionary *)scrollEventDataWithState:(NativeRenderScrollState)state { @@ -517,8 +517,8 @@ - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL } } - [_headerRefreshView scrollViewDidEndDragging]; - [_footerRefreshView scrollViewDidEndDragging]; + [_headerRefreshView scrollViewDidEndDragging:scrollView]; + [_footerRefreshView scrollViewDidEndDragging:scrollView]; } - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {