在UIScrollView的分页上重用3个视图

我做了以下代码,其中三个视图可以在UIScrollView分页过程中重用,以保存实时内存 – >

  #pragma mark - UIScrollView Delegates - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ CGFloat pageWidth = self.view.frame.size.width; CGPoint aContentOffSet = [[self scrollView] contentOffset] ; float currPos = aContentOffSet.x; int selectedPage = roundf(currPos/pageWidth); [[self pageControl] setCurrentPage:selectedPage]; [self update:selectedPage]; } #pragma mark - Custom methods -(void)update:(int) selectedPage{ BOOL view1FrameShallBeUnchanged = false; BOOL view2FrameShallBeUnchanged = false; BOOL view3FrameShallBeUnchanged = false; BOOL aFrame1Matched = false; BOOL aFrame2Matched = false; BOOL aFrame3Matched = false; CGRect aFrame1 = CGRectMake(selectedPage*self.view.frame.size.width, 0.0f, self.view.frame.size.width, self.scrollView.frame.size.height); CGRect aFrame2 = CGRectMake((selectedPage-1)*self.view.frame.size.width, 0.0f, self.view.frame.size.width, self.scrollView.frame.size.height); CGRect aFrame3 = CGRectMake((selectedPage+1)*self.view.frame.size.width, 0.0f, self.view.frame.size.width, self.scrollView.frame.size.height); ViewOnScrollView *aView1 = (ViewOnScrollView*)[[self scrollView] viewWithTag:1234]; ViewOnScrollView *aView2 = (ViewOnScrollView*)[[self scrollView] viewWithTag:12345]; ViewOnScrollView *aView3 = (ViewOnScrollView*)[[self scrollView] viewWithTag:123456]; if(aView1 && aView2 && aView3){ //Check for Frame 1 if(aFrame1.origin.x == aView1.frame.origin.x){ view1FrameShallBeUnchanged = true; aFrame1Matched = true; } else if(aFrame1.origin.x == aView2.frame.origin.x){ view2FrameShallBeUnchanged = true; aFrame1Matched = true; } else if(aFrame1.origin.x ==aView3.frame.origin.x){ view3FrameShallBeUnchanged = true; aFrame1Matched = true; } //Check for Frame 2 if(aFrame2.origin.x == aView1.frame.origin.x){ view1FrameShallBeUnchanged = true; aFrame2Matched = true; } else if(aFrame2.origin.x == aView2.frame.origin.x){ view2FrameShallBeUnchanged = true; aFrame2Matched = true; } else if(aFrame2.origin.x == aView3.frame.origin.x){ view3FrameShallBeUnchanged = true; aFrame2Matched = true; } //Check for Frame 3 if(aFrame3.origin.x == aView1.frame.origin.x){ view1FrameShallBeUnchanged = true; aFrame3Matched = true; } else if(aFrame3.origin.x == aView2.frame.origin.x){ view2FrameShallBeUnchanged = true; aFrame3Matched = true; } else if(aFrame3.origin.x == aView3.frame.origin.x){ view3FrameShallBeUnchanged = true; aFrame3Matched = true; } if(!view1FrameShallBeUnchanged){ if(!aFrame1Matched){ [aView1 setFrame:aFrame1]; } else if(!aFrame2Matched){ [aView1 setFrame:aFrame2]; } else{ [aView1 setFrame:aFrame3]; } [self hideOrShowTheTabs:aView1]; [self hideShowView:aView1]; } if(!view2FrameShallBeUnchanged){ if(!aFrame1Matched){ [aView2 setFrame:aFrame1]; } else if(!aFrame2Matched){ [aView2 setFrame:aFrame2]; } else{ [aView2 setFrame:aFrame3]; } [self hideShowView:aView2]; } if(!view3FrameShallBeUnchanged){ if(!aFrame1Matched){ [aView3 setFrame:aFrame1]; } else if(!aFrame2Matched){ [aView3 setFrame:aFrame2]; } else{ [aView3 setFrame:aFrame3]; } [self hideShowView:aView3]; } } } -(void)hideShowView:(ViewOnScrollView*)theView{ if(theView.frame.origin.x<0 || theView.frame.origin.x>[self.scrollView contentSize].width ) theView.hidden = YES; else{ theView.hidden = NO; } } 

意见/build议/更好的方式来做同样的事情是受欢迎的..

它可以,但是你有太多的代码(~40行)和太多的不必要的处理。 你只需要知道一个帧是否匹配(比方说中间帧),而且只有在页面即将改变时才能做到这一点,而不是每一个滚动事件。

这样,只要左侧或右侧页面成为当前页面,就会将相反页面移到另一侧。

另一个问题是,当frame.origin.x与内容大小(==,或> =)相等时,应该隐藏最后一个+ 1页面,而不是大于(>)。

 #pragma mark - UIScrollView Delegates - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ int selectedPage = roundf(newsPagesView.contentOffset.x/_pageWidth); if (selectedPage != _currentPage) { _currentPage = selectedPage; [self update:selectedPage]; } } #pragma mark - Custom methods -(void)update:(int) selectedPage{ BOOL page1FrameMatched = false; BOOL page2FrameMatched = false; BOOL page3FrameMatched = false; BOOL frameCurrentMatched = false; CGRect frameCurrent = CGRectMake(selectedPage*_pageWidth, 0.0f, _pageWidth, _pageHeight); CGRect frameLeft = CGRectMake((selectedPage-1)*_pageWidth, 0.0f, _pageWidth, _pageHeight); CGRect frameRight = CGRectMake((selectedPage+1)*_pageWidth, 0.0f, _pageWidth, _pageHeight); NewsPage *page1 = (NewsPage*)[newsPagesView viewWithTag:100]; NewsPage *page2 = (NewsPage*)[newsPagesView viewWithTag:101]; NewsPage *page3 = (NewsPage*)[newsPagesView viewWithTag:102]; if(page1 && page2 && page3){ //Check for Current if(frameCurrent.origin.x == page1.frame.origin.x){ page1FrameMatched = true; frameCurrentMatched = true; } else if(frameCurrent.origin.x == page2.frame.origin.x){ page2FrameMatched = true; frameCurrentMatched = true; } else if(frameCurrent.origin.x ==page3.frame.origin.x){ page3FrameMatched = true; frameCurrentMatched = true; } if(frameCurrentMatched){ if(page1FrameMatched){ [page1 setFrame:frameCurrent]; [page2 setFrame:frameLeft]; [page3 setFrame:frameRight]; } else if(page2FrameMatched){ [page1 setFrame:frameRight]; [page2 setFrame:frameCurrent]; [page3 setFrame:frameLeft]; } else{ [page1 setFrame:frameLeft]; [page2 setFrame:frameRight]; [page3 setFrame:frameCurrent]; } [self hideShowView:page1]; [self hideShowView:page2]; [self hideShowView:page3]; } } } /** * This method hides the view if it is outside the scrollview content bounds, ie the * view before page 0, or the view after last page. */ -(void)hideShowView:(NewsPage*)aPage{ if(aPage.frame.origin.x<0 || aPage.frame.origin.x>=[newsPagesView contentSize].width ) aPage.hidden = YES; else{ aPage.hidden = NO; } } 

看看这个类..也许它可以帮助..易于使用…就像UITableview

VSScroller

结帐我的例子,分支:新

https://github.com/iSevenDays/RecyclingScrollView