From e51294a0543ed57749350890d1ec1df1297194d0 Mon Sep 17 00:00:00 2001 From: wwwcg Date: Mon, 12 Aug 2024 17:52:03 +0800 Subject: [PATCH] fix(ios): improved accuracy of ViewPager's ScrollStateChanged API --- ios/sdk/component/viewPager/HippyViewPager.m | 35 ++++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/ios/sdk/component/viewPager/HippyViewPager.m b/ios/sdk/component/viewPager/HippyViewPager.m index 644412ecd11..cc7e4b407a3 100644 --- a/ios/sdk/component/viewPager/HippyViewPager.m +++ b/ios/sdk/component/viewPager/HippyViewPager.m @@ -27,6 +27,13 @@ #import "HippyViewPagerItem.h" #import "HippyI18nUtils.h" + +static NSString *const HippyPageScrollStateKey = @"pageScrollState"; +static NSString *const HippyPageScrollStateIdle = @"idle"; +static NSString *const HippyPageScrollStateSettling = @"settling"; +static NSString *const HippyPageScrollStateDragging = @"dragging"; + + @interface HippyViewPager () @property (nonatomic, strong) NSMutableArray *viewPagerItems; @property (nonatomic, assign) BOOL isScrolling; @@ -181,8 +188,15 @@ - (void)setPage:(NSInteger)pageNumber animated:(BOOL)animated { self.targetContentOffsetX = CGRectGetMinX(theItem.frame); [self setContentOffset:theItem.frame.origin animated:animated]; [self invokePageSelected:pageNumber]; + if (self.onPageScrollStateChanged) { - self.onPageScrollStateChanged(@{ @"pageScrollState": @"idle" }); + if (animated) { + HippyLogTrace(@"[HippyViewPager] settling --- (setPage withAnimation)"); + self.onPageScrollStateChanged(@{ HippyPageScrollStateKey: HippyPageScrollStateSettling }); + } else { + HippyLogTrace(@"[HippyViewPager] idle ~~~~~~ (setPage withoutAnimation)"); + self.onPageScrollStateChanged(@{ HippyPageScrollStateKey: HippyPageScrollStateIdle }); + } } } @@ -225,7 +239,8 @@ - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { } } if (self.onPageScrollStateChanged) { - self.onPageScrollStateChanged(@{ @"pageScrollState": @"dragging" }); + HippyLogTrace(@"[HippyViewPager] dragging --- (BeginDragging)"); + self.onPageScrollStateChanged(@{ HippyPageScrollStateKey : HippyPageScrollStateDragging }); } } @@ -280,8 +295,9 @@ - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL self.isScrolling = NO; } if (self.onPageScrollStateChanged) { - NSString *state = decelerate ? @"settling" : @"idle"; - self.onPageScrollStateChanged(@{ @"pageScrollState": state }); + NSString *state = decelerate ? HippyPageScrollStateSettling : HippyPageScrollStateIdle; + HippyLogTrace(@"[HippyViewPager] %@ ??? (EndDragging)", state); + self.onPageScrollStateChanged(@{ HippyPageScrollStateKey : state }); } } @@ -295,7 +311,8 @@ - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView { - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { if (self.onPageScrollStateChanged) { - self.onPageScrollStateChanged(@{ @"pageScrollState": @"idle" }); + HippyLogTrace(@"[HippyViewPager] idle ~~~~~~ (EndDecelerating)"); + self.onPageScrollStateChanged(@{ HippyPageScrollStateKey : HippyPageScrollStateIdle }); } self.isScrolling = NO; for (NSObject *scrollViewListener in _scrollViewListener) { @@ -306,6 +323,11 @@ - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { } - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView { + if (self.onPageScrollStateChanged) { + HippyLogTrace(@"[HippyViewPager] idle ~~~~~~ (DidEndScrollingAnimation)"); + self.onPageScrollStateChanged(@{ HippyPageScrollStateKey : HippyPageScrollStateIdle }); + } + for (NSObject *scrollViewListener in _scrollViewListener) { if ([scrollViewListener respondsToSelector:@selector(scrollViewDidEndScrollingAnimation:)]) { [scrollViewListener scrollViewDidEndScrollingAnimation:scrollView]; @@ -454,8 +476,7 @@ - (void)layoutSubviews { [self setPage:self.initialPage animated:NO]; _didFirstTimeLayout = YES; self.needsResetPageIndex= NO; - } - else { + } else { if (self.needsResetPageIndex) { [self setPage:_lastPageIndex animated:NO]; self.needsResetPageIndex= NO;