2

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

コメント/提案/同じことを行うためのより良い方法は大歓迎です..

4

3 に答える 3

4

このクラスをチェックしてください..多分それが役立つかもしれません..使いやすいです...ちょうどUITableviewのように

VSScroller

于 2013-06-24T04:31:11.413 に答える
2

大丈夫ですが、コードが多すぎて(〜40行)、不要な処理が多すぎます。1つのフレームがいつ一致するか(たとえば中央のフレーム)を知る必要があるだけです。また、すべてのスクロールイベントではなく、ページが変更されようとしているときにのみこれを行う必要があります。

このように、左または右のページが現在のページになるたびに、反対側のページを反対側に移動します。

もう1つのバグは、 frame.origin.xがコンテンツサイズと等しい場合(==、または> =)、大きい(>)だけでなく、last+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, 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 に答える