对重复使用UIScrollView的寻呼3次(Reusing 3 views on UIScroll

2019-08-01 15:49发布

我做了下面的代码,三个视图可分页过程中重复使用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;
    }
}

意见/建议/更好的方式做同样的欢迎..

Answer 1:

它的好,但你有太多的代码(〜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;
    }
}


Answer 2:

看看这个类..maybe它可以帮助..好用...就像的UITableView

VSScroller



Answer 3:

结帐我的例子中,分支:新

https://github.com/iSevenDays/RecyclingScrollView



文章来源: Reusing 3 views on UIScrollView's Paging