【问题标题】:Infinite Scrolling - setContentOffset: stops deceleration of UIScrollView无限滚动 - setContentOffset:停止 UIScrollView 的减速
【发布时间】:2012-05-10 22:44:33
【问题描述】:

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

我正在尝试在图像上实现无限滚动(仅限水平)。我通过继承 UIScrollView 并实现 setContentOffset: 和 setContentOffset:animated: 来做到这一点,当用户拖动滚动视图时,这非常有效。但是,当用户抬起手指并且滚动视图正在减速时,更改 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: (not setContentOffset:animated:) 解决了这个问题,但我似乎无法让它工作。

我也试过 scrollRectToVisible:animated: 没有成功。

任何有关如何解决此问题的想法将不胜感激。谢谢!

编辑:

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

【问题讨论】:

    标签: iphone ios objective-c uiscrollview scrollview


    【解决方案1】:

    代替

    [scrollView setContentOffset:tempContentOffset];
    

    使用

    scrollView.contentOffset = tempContentOffset;
    

    【讨论】:

    • 这解决了这个问题。你能解释一下它是如何工作的吗?
    【解决方案2】:

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

    【讨论】:

    • 为了避免UIScrollViewDecelerationFast 的需要,您可以将contentSize 设置得非常大,从中间的三倍宽度内容视图和视点开始,然后将内容视图设置为滚动时重新定位;然后,当减速停止时,再次将所有东西放回中间。
    • @hatfinch 感谢您的评论。这几乎就是我最终做的事情,但我不是 100% 确定您所说的“安排在滚动时重新定位该内容视图”是什么意思。你能解释一下这是如何工作的吗?
    • 它的工作原理与您描述的方法一样,只是不是削弱减速以确保用户无法滚动三倍宽度的全景图,而是移动全景图。因此,对于“内容视图”ABC,滚动视图中有 xxxABCxxx(x 只是空格),并且当用户滚动时,例如向左,在他们滚动一个图像宽度后,您移动内容视图,以便您拥有 xxABCxxxx。除了你用这么多的'x'来做这件事,他们必须非常慎重地试图达到边缘。这有意义吗?
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      在里面我会改变内容偏移量

      【讨论】:

      • scrollViewDidScroll 方法是我调用上面显示的 setContentOffset 方法的地方。我也试过直接在scrollViewDidScroll中设置contentOffset,但没有运气。每当设置内容偏移量时,减速立即停止。下面的日志输出显示了内容偏移量的变化,然后触发了scrollViewDidEndDecelerating。 (62.000000 0.000000) (22.000000 0.000000) (0.000000 0.000000) (5113.000000 0.000000) scrollViewDidEndDecelerating
      猜你喜欢
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多