我是iOS开发的新手。我刚刚开始大约一两个月前。我对应用程序有一个想法,但它需要Gesture Recognizers。我已经找到了Gesture Recognizers的文档,但据我所知,它只能检测4个方向。向上,向左,向右和向下。无论如何都要写一些代码,让你检测用户滑动的任何方向。例如,如果用户要向右上方向或右下方向滑动,有没有办法检测到?
编辑:在考虑了这一点后,我想出了一个更好的方法来解释我需要的代码。如果我正在为iOS开发游戏并且用户通常处于摄像机视图(鸟瞰图)中,我想让他们在地图中移动他们的视图,以便他们可以查看敌人的基地或他们的盟友基地,我怎么能检测到那些斜向滑动而不仅仅是向上,向右,向左和向下滑动?
答案 0 :(得分:0)
我觉得你有点困惑。
UISwipeGestureRecognizer
是UIGestureRecognizer
的子类,正如您所说,它仅检测这4个方向的滑动。
然后有UIPanGestureRecognizer
可以用来检测任何方向的移动。它为您提供了一个名为translationInView:
的方法,它可以为您提供手指在任何方向上的位置变化。
答案 1 :(得分:0)
我遇到了你的问题,因为它与我想做的事情类似,但后来却没有使用它。所以我想我将这些代码留给了后人。只需使用UIPanGestureRecognizer并为您的目标/选择器设置类似于此的方法:
typedef enum {
NONE = 0,
LEFT = 1,
RIGHT = 2,
UP = 4,
DOWN = 8
} BLDirection;
-(void)detectDirection:(UIPanGestureRecognizer*)pan {
if (pan.state == UIGestureRecognizerStateEnded) {
CGPoint stopPan = [pan translationInView:self.view];
CGPoint velocity = [pan velocityInView:self.view];
int direction = NONE;
// first determine the directions
if (velocity.x < 0) {
direction |= LEFT;
} else if (velocity.x > 0) {
direction |= RIGHT;
}
if (velocity.y < 0) {
direction |= UP;
} else if (velocity.y > 0) {
direction |= DOWN;
}
// now we figure out the angle of the swipe
double x2 = stopPan.x;
double x1 = 0;
double y2 = abs(stopPan.y);
double y1 = 0;
// angle is in degrees
double angle = atan((y2 - y1 + 1) / (x2 - x1 + 1)) * 57.29577951308233; // 180/pi
// mask out the vertical directions if they aren't sufficiently strong
if ((angle < 0 && angle < -55) || (angle > 0 && angle > 55)) {
direction &= (UP | DOWN);
}
// mask out the horizontal directions if they aren't sufficiently strong
if ((angle < 0 && angle > -35) || (angle > 0 && angle < 35)) {
direction &= (LEFT | RIGHT);
}
NSLog(@"Direction is %s%s%s%s", ((direction & UP) == UP) ? "UP" : "",
((direction & DOWN) == DOWN) ? "DOWN" : "",
((direction & LEFT) == LEFT) ? "LEFT" : "",
((direction & RIGHT) == RIGHT) ? "RIGHT" : "");
// do something here now that you know the direction. The direction could be one of the following:
// UP
// DOWN
// LEFT
// RIGHT
// UP|LEFT
// UP|RIGHT
// DOWN|LEFT
// DOWN|RIGHT
}
}