From fde386f909bf39e4afa075294f44b7cfc2bce66c Mon Sep 17 00:00:00 2001 From: luomy Date: Thu, 15 Apr 2021 15:43:25 +0800 Subject: [PATCH] Bugfix/viewpager (#688) fix(ios): fix view pager onPageSelected call error --- ios/sdk/component/viewPager/HippyViewPager.m | 52 ++++++++++---------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/ios/sdk/component/viewPager/HippyViewPager.m b/ios/sdk/component/viewPager/HippyViewPager.m index 4170f7810..0e9e8081d 100644 --- a/ios/sdk/component/viewPager/HippyViewPager.m +++ b/ios/sdk/component/viewPager/HippyViewPager.m @@ -38,8 +38,8 @@ @property (nonatomic, assign) NSUInteger lastPageIndex; @property (nonatomic, assign) CGFloat targetContentOffsetX; @property (nonatomic, assign) BOOL didFirstTimeLayout; -@property (nonatomic, assign) BOOL invokeOnPageSelected; @property (nonatomic, assign) BOOL needsLayoutItems; +@property (nonatomic, assign) BOOL needsResetPageIndex; @end @@ -115,14 +115,13 @@ - (void)hippySetFrame:(CGRect)frame { [super hippySetFrame:frame]; - self.invokeOnPageSelected = YES; self.needsLayoutItems = YES; + self.needsResetPageIndex = YES; [self setNeedsLayout]; } - (void)didUpdateHippySubviews { [super didUpdateHippySubviews]; - self.invokeOnPageSelected = NO; self.needsLayoutItems = YES; [self setNeedsLayout]; } @@ -138,12 +137,12 @@ return; } + _lastPageIndex = pageNumber; UIView *theItem = self.viewPagerItems[pageNumber]; self.targetContentOffsetX = CGRectGetMinX(theItem.frame); [self setContentOffset:theItem.frame.origin animated:animated]; if (self.onPageSelected) { self.onPageSelected(@{ @"position": @(pageNumber) }); - _lastPageIndex = pageNumber; } if (self.onPageScrollStateChanged) { self.onPageScrollStateChanged(@{ @"pageScrollState": @"idle" }); @@ -323,7 +322,6 @@ if (!isContentSizeEqual || !isFrameEqual) { self.previousFrame = self.frame; self.previousSize = self.contentSize; - self.invokeOnPageSelected = YES; self.needsLayoutItems = YES; [self setNeedsLayout]; } @@ -334,14 +332,20 @@ if (!self.needsLayoutItems) { return; } - if (!self.viewPagerItems.count) + self.needsLayoutItems = NO; + if (!self.viewPagerItems.count) { return; + } for (int i = 1; i < self.viewPagerItems.count; ++i) { UIView *lastViewPagerItem = self.viewPagerItems[i - 1]; UIView *theViewPagerItemItem = self.viewPagerItems[i]; CGPoint lastViewPagerItemRightPoint = [self rightPointOfView:lastViewPagerItem]; - CGRect theFrame = CGRectMake(lastViewPagerItemRightPoint.x, lastViewPagerItemRightPoint.y, theViewPagerItemItem.frame.size.width, - theViewPagerItemItem.frame.size.height); + CGRect theFrame = CGRectMake( + lastViewPagerItemRightPoint.x, + lastViewPagerItemRightPoint.y, + theViewPagerItemItem.frame.size.width, + theViewPagerItemItem.frame.size.height + ); theViewPagerItemItem.frame = theFrame; } @@ -351,16 +355,6 @@ return; } - //如果是第一次加载,那么走initialPage的逻辑 - if (!_didFirstTimeLayout) { - UIView *theItem = self.viewPagerItems[self.initialPage]; - self.contentOffset = theItem.frame.origin; - _didFirstTimeLayout = YES; - } - if (self.contentOffset.x > self.contentSize.width && 0 != self.contentSize.width) { - self.contentOffset = CGPointMake(0, self.contentSize.width); - } - UIView *lastViewPagerItem = self.viewPagerItems.lastObject; if (!lastViewPagerItem) { HippyLogWarn(@"Error In HippyViewPager: addSubview"); @@ -368,17 +362,21 @@ return; } - self.contentSize = CGSizeMake(lastViewPagerItem.frame.origin.x + lastViewPagerItem.frame.size.width, - lastViewPagerItem.frame.origin.y + lastViewPagerItem.frame.size.height); - if (self.onPageSelected && NO == CGSizeEqualToSize(CGSizeZero, self.contentSize) && _invokeOnPageSelected) { - NSUInteger currentPageIndex = self.contentOffset.x / CGRectGetWidth(self.bounds); - if (currentPageIndex != _lastPageIndex) { - _lastPageIndex = currentPageIndex; - self.onPageSelected(@{ @"position": @(currentPageIndex) }); + self.contentSize = CGSizeMake( + lastViewPagerItem.frame.origin.x + lastViewPagerItem.frame.size.width, + lastViewPagerItem.frame.origin.y + lastViewPagerItem.frame.size.height + ); + if (!_didFirstTimeLayout) { + [self setPage:self.initialPage animated:NO]; + _didFirstTimeLayout = YES; + self.needsResetPageIndex= NO; + } + else { + if (self.needsResetPageIndex) { + [self setPage:_lastPageIndex animated:YES]; + self.needsResetPageIndex= NO; } } - [self setPage:_lastPageIndex animated:YES]; - self.needsLayoutItems = NO; } - (NSUInteger)nowPage {