iOS GestureRecognizers所有方向

时间:2014-04-24 02:34:23

标签: ios

我是iOS开发的新手。我刚刚开始大约一两个月前。我对应用程序有一个想法,但它需要Gesture Recognizers。我已经找到了Gesture Recognizers的文档,但据我所知,它只能检测4个方向。向上,向左,向右和向下。无论如何都要写一些代码,让你检测用户滑动的任何方向。例如,如果用户要向右上方向或右下方向滑动,有没有办法检测到?

编辑:在考虑了这一点后,我想出了一个更好的方法来解释我需要的代码。如果我正在为iOS开发游戏并且用户通常处于摄像机视图(鸟瞰图)中,我想让他们在地图中移动他们的视图,以便他们可以查看敌人的基地或他们的盟友基地,我怎么能检测到那些斜向滑动而不仅仅是向上,向右,向左和向下滑动?

2 个答案:

答案 0 :(得分:0)

我觉得你有点困惑。

UISwipeGestureRecognizerUIGestureRecognizer的子类,正如您所说,它仅检测这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
    }
}