Skip to content

Commit

Permalink
fix(ios): improved accuracy of ViewPager's ScrollStateChanged API
Browse files Browse the repository at this point in the history
  • Loading branch information
wwwcg committed Aug 13, 2024
1 parent ab4ddf7 commit e51294a
Showing 1 changed file with 28 additions and 7 deletions.
35 changes: 28 additions & 7 deletions ios/sdk/component/viewPager/HippyViewPager.m
Original file line number Diff line number Diff line change
Expand Up @@ -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<UIView *> *viewPagerItems;
@property (nonatomic, assign) BOOL isScrolling;
Expand Down Expand Up @@ -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 });
}
}
}

Expand Down Expand Up @@ -225,7 +239,8 @@ - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
}
}
if (self.onPageScrollStateChanged) {
self.onPageScrollStateChanged(@{ @"pageScrollState": @"dragging" });
HippyLogTrace(@"[HippyViewPager] dragging --- (BeginDragging)");
self.onPageScrollStateChanged(@{ HippyPageScrollStateKey : HippyPageScrollStateDragging });
}
}

Expand Down Expand Up @@ -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 });
}
}

Expand All @@ -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<UIScrollViewDelegate> *scrollViewListener in _scrollViewListener) {
Expand All @@ -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<UIScrollViewDelegate> *scrollViewListener in _scrollViewListener) {
if ([scrollViewListener respondsToSelector:@selector(scrollViewDidEndScrollingAnimation:)]) {
[scrollViewListener scrollViewDidEndScrollingAnimation:scrollView];
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit e51294a

Please sign in to comment.