我正在编写一个UIView子类,它使用-touches{Began,Moved,Ended,Cancelled}:withEvent:
方法来跟踪拖动和点击。 (我没有使用平移手势识别器,因为它不能识别只是一个水龙头,我不使用水龙头加一个平底锅识别器,因为它们似乎没有以相同的方式穿过阶段。相信我,我已经尝试了两三次了。)在拖动结束时,我想检查速度并对我正在执行的操作做一个小调整,如果他们的手指离开屏幕仍在移动时
问题是,我从速度计算代码中得到了一些奇怪的行为。我的触摸处理方法最终都称为这种简单的速度计算方法:
- (void)updateDraggingVelocityWithTouch:(UITouch*)touch {
NSTimeInterval timespan = touch.timestamp - self.lastDraggingTimestamp;
CGPoint pt = [touch locationInView:self];
CGPoint v;
v.x = (pt.x - self.lastDraggingLocation.x)/timespan;
v.y = (pt.y - self.lastDraggingLocation.y)/timespan;
self.draggingVelocity = v;
NSLog(@"Velocity: %@", NSStringFromCGPoint(v));
self.lastDraggingLocation = pt;
self.lastDraggingTimestamp = touch.timestamp;
}
出于某种原因,这似乎计算了平底锅末端的异常高速度,正是在我想知道速度的时候。例如:
2012-11-10 20:38:02.603 Alef[32850:907] Velocity: {0, 0}
2012-11-10 20:38:02.747 Alef[32850:907] Velocity: {-8.35417, 5.0125}
2012-11-10 20:38:02.763 Alef[32850:907] Velocity: {-30.2068, 0}
2012-11-10 20:38:02.780 Alef[32850:907] Velocity: {-29.7612, 0}
2012-11-10 20:38:02.796 Alef[32850:907] Velocity: {-30.2924, 0}
2012-11-10 20:38:02.863 Alef[32850:907] Velocity: {-7.48297, 0}
2012-11-10 20:38:02.930 Alef[32850:907] Velocity: {-7.526, 0}
2012-11-10 20:38:03.030 Alef[32850:907] Velocity: {-4.99497, 0}
2012-11-10 20:38:03.432 Alef[32850:907] Velocity: {-40.5009, 40.5009}
有时甚至更高 - 我看到滑动的结束速度超过100,否则从未达到15。
知道为什么会这样吗?我应该使用的算法不同于我在这里展示的简单差异吗?