2012-10-19 20 views
2

我做了下面的代碼,三個視圖可分頁過程中UIScrollView爲了重複使用,以節省實時內存 - >對UIScrollView的分頁重複使用3次

#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; 
    } 
} 

的意見/建議/更好的方式做同樣的歡迎您。

+0

那麼,你是否廣告你的代碼? –

+0

希望在此進行建設性評論/討論.. –

+0

在應用中實現分頁取決於您的選擇和目標。你可以在你的方法中使用'UIScrollView',或者使用帶有一些轉換動畫的單個'UIImageView',或者使用'UIPageViewController'。如果你想使用'UIScrollView'並保存內存,你最好使用2個視圖。 –

回答

2

它可以,但你有太多的代碼(~40行)和太多的不必要的處理。你只需要知道一個幀是否匹配(比方說中間幀),並且只有在頁面即將改變時才應該這樣做,而不是在每個滾動事件上。

這樣,只要左側或右側頁面變爲當前頁面,就會將相反頁面移到另一側。

你有另外一個錯誤是,你應該隱藏最後+ 1頁時,其frame.origin.x等於(==,或> =)對內容的大小,不僅更大(>)。

#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, i.e. 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; 
    } 
} 
4

退房這類..maybe它可以幫助..好用...就像UITableView的

VSScroller

+0

謝謝,我會檢查出來的,很難我這個實現很早以前就進入了.. :) –

+1

是的,它是一個非常古老的問題,但我在一週前做了這個類。 :p感覺就像分享它.. :) –

+1

@iVishal感謝分享。這可能對某人有幫助。 – Juliousraj