从触摸方法构建自己的手势识别器?

时间:2014-05-20 13:49:04

标签: ios uikit sprite-kit

我遇到滑动手势识别器的问题 - 它有时很慢,需要一些距离才能检测到。例如,某些时候,只需稍微移动手指就不会发现它。

我正在进行抽搐游戏,并在所有四个方向上用手势处理我的输入,这种行为会导致各种各样的混乱并激怒玩家。

所以我想我需要实现自己的滑动识别器。或者也许是其他人完成了一个图书馆?

到目前为止,我的想法是在touchesBegan:方法中存储触摸位置,然后使用touchesMoved:touchesEnded:方法检查新位置。然后我将比较距离和方向并发射正确的方法。

这是一种正确的方法,还是我错过了什么?

3 个答案:

答案 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;

使用起来非常方便。在您的情况下beginpushend触摸开始,触摸移动,触摸结束(或取消)。最大缓冲区大小是它将存储的点数(触摸接收的N个最后点数)。

你必须明白,如果你想忽略任何滑动手势(例如用户用手指画圆圈),你可能需要更多一点。要执行此类操作,您可能需要计算跟踪的平均方式,然后比较每个子跟踪(point[i+1] - point[i]),以便dot(trace.averageWay, sub-trace.averageWay) = 1+-trashold

编辑:添加了源链接

Source link

答案 2 :(得分:1)

您可以阅读本教程 [http://www.raywenderlich.com/44270/sprite-kit-tutorial-how-to-drag-and-drop-sprites]

我确保您能找到解决问题的方法。