2012-10-13 48 views
1

我正在制作动画无限滚动视图,并使用了Apple的StreetScroller样本。我使用NSTimer(1秒间隔)添加一个动画,调用1秒钟的动画,在其中设置滚动视图的内容偏移量(大约40像素)。它可以很好地工作,但是当调用方法recenterIfNecessary时会出现问题,它基本上重置了scrollview的contentOffset,但也是动画的,所以看起来就像scrollview被“展开”回到中心,然后恢复动画。 我想我应该取消动画时,我正在重新审核,但我不知道如何。它被调用,的NSTimer使用UIScrollView进行动画无限滚动

代码:

- (void)performScroll { 
    CGFloat currentOffset = self.horizontal ? self.contentOffset.x : self.contentOffset.y; 
    CGFloat newOffset = currentOffset + self.kActualPixelsPerSecond; 
    CGPoint offsetPoint; 
    if (self.horizontal) 
     offsetPoint = CGPointMake(newOffset, 0.0); 
    else 
     offsetPoint = CGPointMake(0.0, newOffset); 

    [UIView animateWithDuration:kScrollingTimeInterval 
          delay:0 
         options:UIViewAnimationOptionCurveLinear | UIViewAnimationOptionBeginFromCurrentState 
        animations:^{ 
           [self setContentOffset:offsetPoint animated:NO]; 
        } completion:nil]; 

} 
+0

尝试在performScroll中调用recenterIfNecessary而不在layoutSubviews – Felix

+0

尝试过但发生同样的事情。我也尝试过在完成块中,但事情是动画从未真正完成,因为计时器持续时间和动画持续时间是相同的。如果我不把它放在'if(finished)'块中,它也会放松回到中心。 如果我将动画持续时间设置为小于NSTimer的间隔0.01秒,但我不喜欢该解决方案,那么我可以将它完美地运行。 – Jure

回答

0

这个答案可能为时已晚。当我尝试构建无限滚动视图时,也遇到了同样的情况。

我发现的解决方案是:

  1. 要使标志,指示如果滚动视图是下编程滚动,并检查标志每个recenter。如果该标志开启,则应该丢弃该中继器。

  2. 使用CADisplayLink以编程方式实现滚动。如果您想让动画曲线超过线性,您可以在这里制作自己的定时功能。

  3. 在每个编程式滚动结束时,请再次呼叫recenter。