我遇到滑动手势识别器的问题 - 它有时很慢,需要一些距离才能检测到。例如,某些时候,只需稍微移动手指就不会发现它。
我正在进行抽搐游戏,并在所有四个方向上用手势处理我的输入,这种行为会导致各种各样的混乱并激怒玩家。
所以我想我需要实现自己的滑动识别器。或者也许是其他人完成了一个图书馆?
到目前为止,我的想法是在touchesBegan:
方法中存储触摸位置,然后使用touchesMoved:
或touchesEnded:
方法检查新位置。然后我将比较距离和方向并发射正确的方法。
这是一种正确的方法,还是我错过了什么?
答案 0 :(得分:1)
UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)];
UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)];
// Setting the swipe direction.
[swipeLeft setDirection:UISwipeGestureRecognizerDirectionLeft];
[swipeRight setDirection:UISwipeGestureRecognizerDirectionRight];
// Adding the swipe gesture on image view
[self.imageView addGestureRecognizer:swipeLeft];
[self.imageView addGestureRecognizer:swipeRight];
- (void)handleSwipe:(UISwipeGestureRecognizer *)swipe {
if (swipe.direction == UISwipeGestureRecognizerDirectionLeft) {
}
if (swipe.direction == UISwipeGestureRecognizerDirectionRight) {
}
}
答案 1 :(得分:1)
这是一种正确的方法,但实际上并不容易。我创建了一个类,为我做了类似的事情(实际上是为了抛出一个视图)。
我在这个类中做的是生成一个点缓冲区和一个日期时间缓冲区,然后我可以使用它来计算速度,手势长度......在外面它看起来像这样:
@property NSInteger maximumBufferSize;
@property (readonly) CGFloat traceLength;
@property (readonly) CGPoint traceSpeed;
- (void)begin:(CGPoint)point;
- (void)push:(CGPoint)point;
- (void)end:(CGPoint)point;
使用起来非常方便。在您的情况下begin
,push
和end
触摸开始,触摸移动,触摸结束(或取消)。最大缓冲区大小是它将存储的点数(触摸接收的N个最后点数)。
你必须明白,如果你想忽略任何滑动手势(例如用户用手指画圆圈),你可能需要更多一点。要执行此类操作,您可能需要计算跟踪的平均方式,然后比较每个子跟踪(point[i+1] - point[i]
),以便dot(trace.averageWay, sub-trace.averageWay) = 1+-trashold
。
编辑:添加了源链接
答案 2 :(得分:1)
您可以阅读本教程 [http://www.raywenderlich.com/44270/sprite-kit-tutorial-how-to-drag-and-drop-sprites]
我确保您能找到解决问题的方法。