2012-05-01 109 views
6

的减速我创建一个大的,360度,全景图像的iPhone应用程序。全景图是UIScrollView中的CATiledLayer。无限滚动 - setContentOffset:停止的UIScrollView

我正试图在图像上实现无限滚动(仅限水平方向)。和setContentOffset:动画:我已经通过继承的UIScrollView和实施setContentOffset做到了这一点,这完美的作品,当用户拖动滚动视图。但是,当用户抬起手指并且滚动视图正在减速时,更改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); 
    } 
} 

回答

2

我解决了问题与解决方法。我创建了3个全景的全宽全景图像(犯规,因为我使用的是CATiledLayer影响性能太多),以及decelerationRate属性设置为UIScrollViewDecelerationFast。因此,用户无法减速停止之前太远滚动,如果减速左或右全景图像停止,内容偏移再变回到中间图像。这具有无限滚动的外观,并且这是我可以提出的最佳解决方案。

+0

为了避免需要'UIScrollViewDecelerationFast',你可以使'contentSize'非常大,从你的三宽度内容视图和视点开始,并安排内容视图在滚动时重新定位;那么,当减速停止时,将所有的东西都放回到中间。 – hatfinch

+0

@hatfinch感谢您的评论。这几乎是我最终做的,但我不能100%确定你的意思是“安排在滚动时重新定位内容视图”。你能解释这将如何工作? –

+0

它会像您所描述的方法一样工作,除非不削弱减速以确保用户无法滚动三倍宽度全景,而是移动全景。因此,对于“内容视图”ABC,您在滚动视图中有xxxABCxxx(x仅为空白),并且当用户滚动例如在左侧滚动一个图像宽度后,移动内容视图,以便拥有xxABCxxxx。除了你用这么多'x'来做它,他们必须非常慎重地试图达到边缘。那有意义吗? – hatfinch

0

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

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

,它被称为当用户滚动(即使它的减速)

和里面我会改变contentoffset

+0

的scrollViewDidScroll方法是其中我打电话如上所示的方法setContentOffset。我也尝试直接在scrollViewDidScroll中设置contentOffset,但没有运气。 每当设置内容偏移时,减速立即停止。下面的日志输出显示内容偏移更改,然后触发scrollViewDidEndDecelerating。 '(62.000000 0.000000)(22.000000 0.000000)(0.000000 0.000000)(5113.000000 0.000000)scrollViewDidEndDecelerating' –

+0

怎么样?发布你的scrollViewDidScroll的代码... – meronix

0

我最近在做同样的无限滚动和意外找到了解决办法:

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

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

1

代替

[scrollView setContentOffset:tempContentOffset]; 

使用

scrollView.contentOffset = tempContentOffset; 
相关问题