5

嘿,我知道已经有一些关于此的帖子 - 但我仍然无法为我遇到的问题找到足够的答案。

刚接触 cocoa 和 iOS,我正在开发我的第一个 iOS 游戏。在这个游戏中,我希望能够计算用户滑动的速度。我很容易找到滑动动作中连续触摸之间的距离,但很难确定触摸之间经过的时间

  • touchesMoved:我使用当前触摸进行计算以及跟踪上次记录的触摸作为 UITouch

  • touchesEnded:我现在想计算滑动的速度,但是当我做类似的事情时:

    双倍timeDelay = event.timestamp - self.previousTouch.timestamp;

这总是返回 0。

但是,使用 gcc 我可以看到这两个时间戳实际上并不相同。此外,经过检查,我发现这些事件的 NSTimeInterval 值的大小约为 10^(-300)。这似乎很奇怪,因为 NSTimeInterval 应该报告自系统启动以来的秒数,不是吗?

我还尝试跟踪上一次触摸的 NSDate 并将其与 [NSDate timeIntervalSinceNow] 结合使用。这产生了更奇怪的结果,每次都返回一个大约 6 的值。同样,由于 timerIntervalSinceNow 返回 a NSTimeInterval,这个值很奇怪。

我对时间戳有什么不了解的地方?事件?对此的任何帮助将不胜感激!谢谢你的时间

一些支持代码:

在 sampleController.h 中:

@property(nonatomic) UITouch* previousTouch
@property(nonatomic) UITouch* currentTouch

在 sampleController.m 中:

@synthesize previousTouch = _previousTouch, currentTouch = _currentTouch;
...
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
       self.currentTouch = [[event allTouches] anyObject];
       // do stuff with currentTouch
}
...
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
       self.previousTouch = self.currentTouch;
       self.currentTouch = [[event allTouches] anyObject];
       // do stuff with currentTouch
}
...
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
       float distanceMoved = [self.touch locationInView:self.playView].x - 
              [self.touch previousLocationInView:self.playView].x;
       // attempt 1
       double timeElapsed = self.currentTouch.timestamp - self.previousTouch.timestamp;

       // attempt 2
       double timeElapsed = event.timestamp - self.previousTouch.timestamp;

       // do stuff with distanceMoved and timeDelay
}
4

1 回答 1

4

UIPanGestureRecognizer具有velocityInView您可能会发现使用的特性。文档在这里

此外,您可能会发现这个 ray wenderlich教程内容丰富。

(这不是一个小问题 - 但是一些谷歌搜索会发现大量关于这类事情的材料。为更大的生活问题节省了所有的头发拉扯;-)

于 2012-06-17T01:17:51.847 回答