From b0c25432c56c22bfdd208cb73d9c01a9aebe3f49 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 --- .../component/viewPager/HippyViewPager.mm | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/renderer/native/ios/renderer/component/viewPager/HippyViewPager.mm b/renderer/native/ios/renderer/component/viewPager/HippyViewPager.mm index 68ad2dee578..e699ad605bd 100644 --- a/renderer/native/ios/renderer/component/viewPager/HippyViewPager.mm +++ b/renderer/native/ios/renderer/component/viewPager/HippyViewPager.mm @@ -29,6 +29,13 @@ #import "HippyRenderUtils.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; @@ -189,8 +196,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 }); + } } } @@ -233,7 +247,8 @@ - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { } } if (self.onPageScrollStateChanged) { - self.onPageScrollStateChanged(@{ @"pageScrollState": @"dragging" }); + HippyLogTrace(@"[HippyViewPager] dragging --- (BeginDragging)"); + self.onPageScrollStateChanged(@{ HippyPageScrollStateKey : HippyPageScrollStateDragging }); } } @@ -288,8 +303,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 }); } } @@ -303,7 +319,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) { @@ -314,6 +331,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]; @@ -482,8 +504,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;