滚动 UITableView 的 NSTimer 很慢

NSTimer to scroll UITableView is slow

我正在使用 NSTimer 触发滚动 UITableView 的方法

self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 
                                              target:self
                                            selector:@selector(scroller)
                                            userInfo:nil
                                             repeats:YES];

-(void)scroller
{
    [self.row1TableView setContentOffset:CGPointMake(self.row1TableView.contentOffset.x, self.row1TableView.contentOffset.y - 50) animated:YES]; 
}

问题是滚动似乎很慢。它比间隔中的 0.1 秒更接近 1 秒。

有什么问题?

NSTimer 在当前线程 运行 循环上调用选择器。它可能不是 100% 精确的时间,因为它试图从队列中取出消息 运行 循环并执行选择器。

据我所知,您无法更改 setContentOffset:animated: 的默认动画持续时间。但是你可以做的是,设置一个核心动画显示link(CADisplayLink - 你可以搜索关于如何设置的代码示例,但它相当直截了当。class 文档应该是一个很好的起点)它会触发每一帧,回调你提供的方法。

在该回调方法中,您可以计算要滚动多少 table 视图(每帧多少点),然后调用 setContentOffset:animated: 并将第二个参数设置为 NO(立即滚动)。您应该实施某种缓动以获得更好的结果。

注:之所以使用CADisplayLink而不是NSTimer,是因为它更可靠。这是您在 SpriteKit 可用之前在游戏中使用的内容。

附录: This blog post 有一些关于如何设置显示 link 和相应回调方法的示例代码。

附录 2: 您可以设置一个实例变量作为“计数器”,并在每次调用您的回调(使用属性 duration and/or frameInterval)。一旦计数器达到临界值(即动画有 运行 足够的时间),您可以通过调用方法停止显示 link 更新:

-[CADisplayLink invalidate].