1

内部にいくつかの UIView を持つスクロールビューを実装したいと考えています。一番左のアイテムは、残りのアイテムよりも大きくする必要があります。だから私の問題はこれです。アイテムが画面の左に移動する (origin.x が 15 未満) 場合は常に、アイテムを 470x440 から 235x220 ピクセルに縮小する必要があります。これはかなり簡単に実装できます。問題は、ピクセル 480 の左に移動するアイテムを 235x220 ピクセルから 470x440 ピクセルにズームインする必要があり、さらに左に 235 ピクセル移動する必要があることです (アイテムをその右に覆わないように、むしろ、「縮小」したときに要素が残したスペースに移動します。

これに対していくつかの異なるアプローチを試みましたが、アニメーションの見栄えが良くなく、あちこちにたくさんの不具合があります。

このタイプの機能を実装する方法を知っている人はいますか? ズームしたくないことに注意してください。ただし、一番左の要素 (画面に表示されている) が他の要素のサイズの 2 倍になるように、スクロール ビュー内の要素のサイズを変更したいと考えています。

4

1 に答える 1

3

他の誰かが興味を持っている場合に備えて、scrollViewDidScroll 内で次のようになりました。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {        
    float contentOffset = scrollView.contentOffset.x;
    int leavingElementIndex = [_scrollView indexOfElementLeavingScene:scrollView.contentOffset.x];
    int entereingElementIndex = leavingElementIndex + 1;

    if (leavingElementIndex >= 0 && contentOffset > 0) {
        CGRect leavingFrame = [[[scrollView subviews] objectAtIndex:leavingElementIndex] frame];
        CGRect enteringFrame = [[[scrollView subviews] objectAtIndex:entereingElementIndex] frame];

        float scalePerentage = (contentOffset - (_scrollView.smallBoxWidth * leavingElementIndex))/(_scrollView.smallBoxWidth);
        enteringFrame.size.width = _scrollView.smallBoxWidth + (_scrollView.smallBoxWidth * scalePerentage);
        enteringFrame.size.height = _scrollView.smallBoxHeight + (_scrollView.smallBoxHeight * scalePerentage);
        enteringFrame.origin.x = [_scrollView leftMostPointAt:entereingElementIndex] - (_scrollView.smallBoxWidth * scalePerentage);

        [[[scrollView subviews] objectAtIndex:entereingElementIndex] setFrame:enteringFrame];

        leavingFrame.size.width = _scrollView.largeBoxWidth - (_scrollView.smallBoxWidth * scalePerentage);
        leavingFrame.size.height = _scrollView.largeBoxHeight - (_scrollView.smallBoxHeight * scalePerentage);

        [[[scrollView subviews] objectAtIndex:leavingElementIndex] setFrame:leavingFrame];

        //Reset the other visible frames sizes
        int index = 0;
        for (UIView *view in [scrollView subviews]) {

            if([view isKindOfClass:[SlidingView class]] && index > entereingElementIndex) {
                CGRect frame = view.frame;
                frame.size.width = _scrollView.smallBoxWidth;
                frame.size.height = _scrollView.smallBoxHeight;
                frame.origin.x = [_scrollView leftMostPointAt:index];
                [view setFrame:frame];
            }

            index++;
        }

    }    
}

最終的には次のようになります。

最終結果 http://stuff.haagen.name/iOS%20scroll%20resize.gif

于 2012-06-07T11:56:50.787 に答える