2

我做了以下代码,在分页期间可以重用三个视图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;
    }
}

欢迎评论/建议/更好的方法来做同样的事情。

4

3 回答 3

4

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

VSScroller

于 2013-06-24T04:31:11.413 回答
2

没关系,但是您有太多代码(约 40 行)和太多不必要的处理。您只需要知道一帧何时匹配(假设是中心帧),并且您应该仅在页面即将更改时执行此操作,而不是在每个滚动事件时执行此操作。

这样,每当左侧或右侧页面成为当前页面时,您就会将相反页面移动到另一侧。

您遇到的另一个错误是,当它的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;
    }
}
于 2012-10-29T17:58:40.997 回答
0

查看我的示例,分支:新

https://github.com/iSevenDays/RecyclingScrollView

于 2014-02-15T03:21:27.597 回答