滚动 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]
.
我正在使用 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]
.