带有subView Zooming的UIScrollView

时间:2012-06-06 14:19:02

标签: ios ios5 uiscrollview resize

我想实现一个内部有几个UIView的scrollview。最左边的项目需要大于其他项目。所以我的问题是这个。每当一个项目离开屏幕左侧(其origin.x小于15)时,我需要将项目从470x440缩小到235x220像素。这很容易实现。问题是移动到像素480左侧的项目需要从235x220像素放大到470x440像素并且需要向左移动235像素(以便不覆盖其右侧的项目,而是移动到离开元素“收缩”时留下的空间。

我尝试了一些不同的方法,但我不能让动画看起来很好,而且这里和那里都有一堆小故障。

有谁知道如何实施此类功能?请注意,我不想缩放,但我希望调整滚动视图内的元素,使最左边的元素(在屏幕上可见)的大小是其他元素的两倍。

1 个答案:

答案 0 :(得分: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++;
        }

    }    
}

这就是它最终的样子:

End Result http://stuff.haagen.name/iOS%20scroll%20resize.gif