无限滚动 - setContentOffset:停止UIScrollView的减速

时间:2012-05-01 11:40:16

标签: iphone ios objective-c uiscrollview scrollview

我正在创建一个带有360度全景图像的iPhone应用程序。全景图是UIScrollView中的CATiledLayer。

我试图在图像上实现无限滚动(仅水平)。我通过继承UIScrollView并实现setContentOffset:和setContentOffset:animated来完成此操作:当用户拖动scrollview时,这非常有效。但是,当用户抬起手指并且滚动视图正在减速时,更改contentOffset会导致减速立即停止。

- (void)setContentOffset:(CGPoint)contentOffset 
{    
    CGPoint tempContentOffset = contentOffset;

    if ((int)tempContentOffset.x >= 5114)
    {
        tempContentOffset = CGPointMake(1, tempContentOffset.y);
    }
    else if ((int)tempContentOffset.x <= 0)
    {
        tempContentOffset = CGPointMake(5113, tempContentOffset.y);
    }

    [super setContentOffset:tempContentOffset];    
}

有没有办法在不影响减速的情况下更改contentOffset?

有人建议here重写setContentOffset :(不是setContentOffset:animated :)修复了这个问题,但我似乎无法让它运转起来。

我也尝试过scrollRectToVisible:动画:没有成功。

如何解决这个问题的任何想法将不胜感激。谢谢!

修改

scrollViewDidScroll代码:

-(void)scrollViewDidScroll:(PanoramaScrollView *)scrollView
{
    [panoramaScrollView setContentOffset:panoramaScrollView.contentOffset];
}   

我也试过这个:

-(void)scrollViewDidScroll:(PanoramaScrollView *)scrollView
{
    CGPoint tempContentOffset = panoramaScrollView.contentOffset;

    if ((int)tempContentOffset.x >= 5114)
    {
        panoramaScrollView.contentOffset = CGPointMake(1, panoramaScrollView.contentOffset.y);
    }
    else if ((int)tempContentOffset.x == 0)
    {
        panoramaScrollView.contentOffset = CGPointMake(5113, panoramaScrollView.contentOffset.y);
    }
}

4 个答案:

答案 0 :(得分:3)

而不是

[scrollView setContentOffset:tempContentOffset];

使用

scrollView.contentOffset = tempContentOffset;

答案 1 :(得分:2)

我通过解决方法解决了这个问题。我创建了一个全景图像,其中包含3个全景宽度(不会影响性能,因为我正在使用CATiledLayer),并将decelerationRate属性设置为UIScrollViewDecelerationFast。因此,用户在减速停止之前不能滚动太远,并且如果减速停止在左或右全景图像中,则内容偏移然后改变回中间图像。这有无限滚动的外观,这是我能想到的最好的解决方案。

答案 2 :(得分:0)

我会尝试使用UIScrollViewDelegate协议方法:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView;

当用户滚动时(即使它在减速时)调用它

在里面我会更改contentoffset

答案 3 :(得分:0)

我最近做了同样的无限滚动,并意外地找到了解决方案:

只需设置bounces=YESalwaysBounceHorizontal=YES或/和alwaysBounceVertical=YES(取决于您滚动的方向)。

就是这样,这对我有用。 :)