1

我正在制作一个动画无限滚动视图,并且我使用了Apple 的StreetScroller示例。我正在添加一个带有 NSTimer(1 秒间隔)的动画,调用一个 1 秒的动画,我正在设置滚动视图的内容偏移量(40 像素左右)。它工作得很好,但是当调用该方法时会出现问题,该方法recenterIfNecessary基本上重置了contentOffset滚动视图,但它也是动画的,所以看起来滚动视图“展开”回到中心,然后恢复动画。我猜我应该在重新定位时取消动画,但我不确定如何。

使用 NSTimer 调用的代码:

- (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];

}
4

1 回答 1

0

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

我找到的解决方案是:

  1. 制作一个标志来指示滚动视图是否在程序化滚动下,并检查每个重新定位器的标志。如果该标志打开,则应丢弃重新定位器。

  2. 使用 CADisplayLink 以编程方式实现滚动。如果您想要动画曲线不仅仅是线性的,您可以在这里创建自己的计时函数。

  3. 在每个程序化滚动结束时,另外调用recenter。

于 2014-05-26T04:37:10.457 回答