NSTimer滚动UITableView很慢

时间:2015-07-01 05:45:31

标签: ios uitableview nstimer

我正在使用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]; 
}

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

有什么问题?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

据我所知,您无法更改setContentOffset:animated:的默认动画持续时间。但是你可以做的是,设置一个核心动画显示链接(CADisplayLink - 你可以搜索关于如何设置的代码示例,但它非常简单。类文档应该是一个开始的好地方)它会触发每一帧,回复你提供的方法。

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

注意:使用CADisplayLink代替NSTimer的原因是,它更可靠。这是您在SpriteKit可用之前在游戏中使用的内容。

附录: This blog post有一些示例代码,介绍如何设置显示链接和相应的回调方法。

附录2:您可以设置一个实例变量作为"计数器",然后按照自上一帧以来经过的时间量增加它,在您的每次调用中回调(使用属性duration和/或frameInterval)。一旦计数器达到临界值(即动画运行了足够的时间),您可以通过调用方法停止显示链接更新:

-[CADisplayLink invalidate]