我正在使用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秒。
有什么问题?
答案 0 :(得分:1)
NSTimer
调用当前线程上的选择器运行循环。它可能不是100%精确的时间,因为它试图使消息出列
运行循环并执行选择器。
答案 1 :(得分:1)
据我所知,您无法更改setContentOffset:animated:
的默认动画持续时间。但是你可以做的是,设置一个核心动画显示链接(CADisplayLink
- 你可以搜索关于如何设置的代码示例,但它非常简单。类文档应该是一个开始的好地方)它会触发每一帧,回复你提供的方法。
在该回调方法中,您可以计算滚动表格视图的数量(每帧多少点数),并在第二个参数设置为setContentOffset:animated:
时调用NO
(立即滚动) 。你应该实现某种缓和以获得更好的结果。
注意:使用CADisplayLink
代替NSTimer
的原因是,它更可靠。这是您在SpriteKit可用之前在游戏中使用的内容。
附录: This blog post有一些示例代码,介绍如何设置显示链接和相应的回调方法。
附录2:您可以设置一个实例变量作为"计数器",然后按照自上一帧以来经过的时间量增加它,在您的每次调用中回调(使用属性duration
和/或frameInterval
)。一旦计数器达到临界值(即动画运行了足够的时间),您可以通过调用方法停止显示链接更新:
-[CADisplayLink invalidate]
。