Reusing 3 views on UIScrollView's Paging

时间秒杀一切 提交于 2019-12-03 09:01:56

Its ok, but you have too much code (~40 lines) and too much unnecessary processing. You only need to know when one frame matches (let's say the center frame), and also you should do this only when the page is about to change, not on every scroll event.

This way, whenever the left or right page becomes the current page, you move the opposite page to the other side.

Another bug you had is that you should hide the last+1 page when its frame.origin.x is equal (== , or >=) to the content size, not only bigger (>).

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

check out this class ..maybe it can help.. easy to use...just like UITableview

VSScroller

Checkout my example, branch:new

https://github.com/iSevenDays/RecyclingScrollView

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!