From 908219e288af4b393399824e76031986258cd93d Mon Sep 17 00:00:00 2001 From: Kyle Xie Date: Tue, 24 May 2016 16:26:39 +0800 Subject: [PATCH 1/2] scroll to a specific page --- Classes/InfinitePagingView.h | 8 ++++++++ Classes/InfinitePagingView.m | 22 +++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/Classes/InfinitePagingView.h b/Classes/InfinitePagingView.h index 32e0261..e1346e7 100755 --- a/Classes/InfinitePagingView.h +++ b/Classes/InfinitePagingView.h @@ -100,4 +100,12 @@ typedef enum { */ - (void)scrollToNextPage; +/*! + Scroll to specific page. + @method scrollToPage:animated: + @param NSInteger page + @param BOOL animated + */ +- (void)scrollToPage:(NSInteger)page animated:(BOOL)animated; + @end diff --git a/Classes/InfinitePagingView.m b/Classes/InfinitePagingView.m index 0f8e10f..c1fba53 100755 --- a/Classes/InfinitePagingView.m +++ b/Classes/InfinitePagingView.m @@ -167,6 +167,27 @@ - (void)scrollToDirection:(NSInteger)moveDirection animated:(BOOL)animated [_innerScrollView scrollRectToVisible:adjustScrollRect animated:animated]; } +- (void)scrollToPage:(NSInteger)page animated:(BOOL)animated +{ + if (!_pageViews.count || page < 0) { + return; + } + NSInteger realPage = page % _pageViews.count; + CGRect adjustScrollRect; + if (_scrollDirection == InfinitePagingViewHorizonScrollDirection) { + if (0 != fmodf(_innerScrollView.contentOffset.x, _pageSize.width)) return ; + adjustScrollRect = CGRectMake(_innerScrollView.frame.size.width * realPage, + _innerScrollView.contentOffset.y, + _innerScrollView.frame.size.width, _innerScrollView.frame.size.height); + } else { + if (0 != fmodf(_innerScrollView.contentOffset.y, _pageSize.height)) return ; + adjustScrollRect = CGRectMake(_innerScrollView.contentOffset.x, + _innerScrollView.frame.size.height * realPage, + _innerScrollView.frame.size.width, _innerScrollView.frame.size.height); + } + [_innerScrollView scrollRectToVisible:adjustScrollRect animated:animated]; +} + #pragma mark - UIScrollViewDelegate methods - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView @@ -247,7 +268,6 @@ - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView NSUInteger idx = 0; for (UIView *pageView in _pageViews) { - UIView *pageView = [_pageViews objectAtIndex:idx]; if (_scrollDirection == InfinitePagingViewHorizonScrollDirection) { pageView.center = CGPointMake(idx * _innerScrollView.frame.size.width + _innerScrollView.frame.size.width / 2, _innerScrollView.center.y); } else { From a21d2a46a64e184ea4651325da5ab75f7e3a6bee Mon Sep 17 00:00:00 2001 From: Kyle Xie Date: Sun, 5 Jun 2016 15:31:01 +0800 Subject: [PATCH 2/2] scroll to specfic page --- Classes/InfinitePagingView.h | 14 +++++++ Classes/InfinitePagingView.m | 79 ++++++++++++++++++++++++++---------- 2 files changed, 72 insertions(+), 21 deletions(-) diff --git a/Classes/InfinitePagingView.h b/Classes/InfinitePagingView.h index e1346e7..31e9ebe 100755 --- a/Classes/InfinitePagingView.h +++ b/Classes/InfinitePagingView.h @@ -108,4 +108,18 @@ typedef enum { */ - (void)scrollToPage:(NSInteger)page animated:(BOOL)animated; +/*! + Get page view at a specfic index. + @method pageWithIndex: + @param NSInteger index + */ +- (UIView *)pageWithIndex:(NSInteger)index; + +/*! + Get page view at a specfic location. + @method pageAtLocation: + @param CGPoint location + */ +- (UIView *)pageAtLocation:(CGPoint)location; + @end diff --git a/Classes/InfinitePagingView.m b/Classes/InfinitePagingView.m index c1fba53..aa1d39a 100755 --- a/Classes/InfinitePagingView.m +++ b/Classes/InfinitePagingView.m @@ -36,6 +36,7 @@ @implementation InfinitePagingView UIScrollView *_innerScrollView; NSMutableArray *_pageViews; NSInteger _lastPageIndex; + NSInteger _destinationPageIndex; } @synthesize pageSize = _pageSize; @@ -65,6 +66,8 @@ - (void)setFrame:(CGRect)frame _scrollDirection = InfinitePagingViewHorizonScrollDirection; [self addSubview:_innerScrollView]; self.pageSize = frame.size; + + _destinationPageIndex = -1; } } @@ -94,6 +97,7 @@ - (void)addPageView:(UIView *)pageView if (nil == _pageViews) { _pageViews = [NSMutableArray array]; } + pageView.tag = _pageViews.count; [_pageViews addObject:pageView]; [self layoutPages]; } @@ -164,6 +168,7 @@ - (void)scrollToDirection:(NSInteger)moveDirection animated:(BOOL)animated _innerScrollView.frame.size.width, _innerScrollView.frame.size.height); } + [_innerScrollView scrollRectToVisible:adjustScrollRect animated:animated]; } @@ -172,20 +177,37 @@ - (void)scrollToPage:(NSInteger)page animated:(BOOL)animated if (!_pageViews.count || page < 0) { return; } + NSInteger realPage = page % _pageViews.count; - CGRect adjustScrollRect; - if (_scrollDirection == InfinitePagingViewHorizonScrollDirection) { - if (0 != fmodf(_innerScrollView.contentOffset.x, _pageSize.width)) return ; - adjustScrollRect = CGRectMake(_innerScrollView.frame.size.width * realPage, - _innerScrollView.contentOffset.y, - _innerScrollView.frame.size.width, _innerScrollView.frame.size.height); - } else { - if (0 != fmodf(_innerScrollView.contentOffset.y, _pageSize.height)) return ; - adjustScrollRect = CGRectMake(_innerScrollView.contentOffset.x, - _innerScrollView.frame.size.height * realPage, - _innerScrollView.frame.size.width, _innerScrollView.frame.size.height); + UIView *pageView = [self pageWithIndex:realPage]; + if (!pageView) { + return; } - [_innerScrollView scrollRectToVisible:adjustScrollRect animated:animated]; + + [_innerScrollView scrollRectToVisible:pageView.frame animated:animated]; + _currentPageIndex = page; + if (!animated) { + [self _pageChanges]; + } +} + +- (UIView *)pageWithIndex:(NSInteger)index { + for (UIView *p in _pageViews) { + if (p.tag == index) { + return p; + } + } + return nil; +} + +- (UIView *)pageAtLocation:(CGPoint)location { + CGPoint point = [_innerScrollView convertPoint:location fromView:self]; + for (UIView *page in _pageViews) { + if (CGRectContainsPoint(page.frame, point)) { + return page; + } + } + return nil; } #pragma mark - UIScrollViewDelegate methods @@ -218,8 +240,7 @@ - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView } } -- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView -{ +- (void)_pageChanges { NSInteger pageIndex = 0; if (_scrollDirection == InfinitePagingViewHorizonScrollDirection) { pageIndex = _innerScrollView.contentOffset.x / _innerScrollView.frame.size.width; @@ -276,16 +297,32 @@ - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView ++idx; } [self scrollToDirection:moveDirection animated:NO]; - + _lastPageIndex = pageIndex; - if (nil != delegate && [delegate respondsToSelector:@selector(pagingView:didEndDecelerating:atPageIndex:)]) { - _currentPageIndex += moveDirection; - if (_currentPageIndex < 0) { - _currentPageIndex = _pageViews.count - 1; - } else if (_currentPageIndex >= _pageViews.count) { - _currentPageIndex = 0; + CGRect visibleRect = CGRectMake( + _innerScrollView.contentOffset.x, + _innerScrollView.contentOffset.y, + CGRectGetWidth(_innerScrollView.frame), + CGRectGetHeight(_innerScrollView.frame)); + + for (UIView *pageView in _pageViews) { + if (CGRectIntersectsRect(visibleRect, pageView.frame)) { + self.currentPageIndex = pageView.tag; + break; } + } +} + +- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView +{ + [self _pageChanges]; +} + +- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView +{ + [self _pageChanges]; + if (nil != delegate && [delegate respondsToSelector:@selector(pagingView:didEndDecelerating:atPageIndex:)]) { [delegate pagingView:self didEndDecelerating:_innerScrollView atPageIndex:_currentPageIndex]; } }