4

画面の右下から中央に向かって2本の指で斜めにスワイプするのを検出したいと思います。方向を「UISwipeGestureRecognizerDirectionUp|UISwipeGestureRecognizerDirectionLeft」に設定してUISwipeGestureRecognizerを追加しようとしましたが、画面の中央から左上にスワイプを開始してもハンドラーが呼び出されるため、無駄になりました。

UIGestureRecognizerをサブクラス化する必要がありますか、それともtouchesBeganとtouchesMovedを使用してこれを処理できますか?

4

5 に答える 5

1

原因の touches メソッドはすべてのジェスチャーを行うことができ、ジェスチャーは ios3.2 からサポートされています。簡単なコードを提供できます。自分で変更することもできます。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    isTwoFingersBegin = NO;
    isTwoFingersEnd = NO;
    UITouch *touch = [touches anyObject];
    UIView *touchView = [touch view];
    if ([touches count] == 2)
    {
        isTwoFingersBegin = YES;
    }

    touchStartPoint = [touch locationInView:self.view];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    isSwip = YES;
}
#define TOUCH_MOVE_EFFECT_DIST 30
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{   
    UITouch *touch = [touches anyObject];
    UIView *touchView = [touch view];
    touchEndPoint = [touch locationInView:self.view];
    if ([touches count] == 2)
    {
        isTwoFingersEnd = YES;
    }
    CGPoint deltaVector = CGPointMake(touchEndPoint.x - touchStartPoint.x, touchEndPoint.y - touchStartPoint.y);

    if (fabsf(deltaVector.x) > TOUCH_MOVE_EFFECT_DIST
                &&fabsf(deltaVector.y) > TOUCH_MOVE_EFFECT_DIST
                && isSwip &&isTwoFingersBegin&&isTwoFingersEnd) {
                theSwipGesture=RightUpGesture;
            }
    else if (fabsf(deltaVector.x) <- TOUCH_MOVE_EFFECT_DIST
                && fabsf(deltaVector.y) <- TOUCH_MOVE_EFFECT_DIST
                && isSwip&&isTwoFingersBegin&&isTwoFingersEnd) {
                theSwipGesture=LeftDownGesture;
            }

    isSwip = NO;
}
于 2012-07-29T07:00:33.457 に答える
1

とにかく使用するにはサブクラス化する必要がtouchesBeganあります。touchesMovedあなたUISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionLeftが言ったように、2 つの s を設定しますCGRect。1 つは許容可能な開始点用で、もう 1 つは許容可能な終了点用です。次に、UIGestureRecognizerDelegateメソッドgestureRecognizer:shouldReceiveTouch:を使用し、 を使用して、タッチ ポイントが許容可能な開始矩形内にあるかどうかを確認しCGRectContainsPoint()ます。次に(私が思うに)UISwipeGestureRecognizerサブクラスでオーバーライドtouchesEnded:withEvent:し、エンドタッチが許容範囲内にあるかどうかを確認します。そうでない場合は、状態をに設定しUIGestureRecognizerStateCancelledます (または、ジェスチャをキャンセルすることになっています)。また、アタッチ先のビューにmultipleTouchEnabledプロパティが設定されていることを確認してください。私は実際にこれを試したことはありませんが、何かがそれを行うはずです。幸運を!

編集

実際、受け入れ可能な開始点/終了点の特定の rect 値について心配する必要がなく、デバイスに依存しないようにする場合は、次のようにすることができます。

//swap in whatever percentage of the screen's width/height you want in place of ".75f"

//set the origin for acceptable start points
CGFloat startRect_x = self.view.frame.size.width * .75f;
CGFloat startRect_y = self.view.frame.size.height * .75f;

//set the size
CGFloat rectWidth = self.view.frame.size.width - startRect_x;
CGFloat rectHeight = self.view.frame.size.height - startRect_y;

//make the acceptable start point rect
CGRect startRect = CGRectMake(startRect_x, startRect_y, rectWidth, rectHeight);

//set the origin for the accepable end points
CGFloat endRect_x = self.view.center.x - rectWidth/2;
CGFloat endRect_y = self.view.center.y - rectHeight/2;

//make the acceptable end point rect
CGRect endRect = CGRectMake(endRect_x, endRect_y, rectWidth, rectHeight);
于 2012-07-29T07:01:42.360 に答える
1

あなたが使用することができますUIPanGestureRecognizer

- (void)viewPanned:(UIPanGestureRecognizer *)panGR
{
    CGPoint translation = [panGR translationInView:self];

    CGFloat threshold = self.bounds.size.width/2;

    // Detect
    Direction direction = DirectionUnknown;

    if (translation.x > threshold) {
        if (translation.y > threshold) {
            direction = DirectionBottomRight;
        } else if (translation.y < -threshold) {
            direction = DirectionTopRight;
        } else {
            direction = DirectionRight;
        }
    } else if (translation.x < -threshold) {
        if (translation.y > threshold) {
            direction = DirectionBottomLeft;
        } else if (translation.y < -threshold) {
            direction = DirectionTopLeft;
        } else {
            direction = DirectionLeft;
        }
    } else {
        if (translation.y > threshold) {
            direction = DirectionBottom;
        } else if (translation.y < -threshold) {
            direction = DirectionTop;
        }
    }
}
于 2014-11-25T15:03:17.213 に答える
0

みんなありがとう!

私はtouchesBegan、touchesMoved、touchesEndedでカスタムコードを書くことになり、otは魅力のように機能します。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

    if ([touches count] == 2) {
        CGPoint nowPoint = [[touches anyObject] locationInView:self];
        if( nowPoint.x >= ALLOWED_X)
            swipeUp = YES;
    }

    [super touchesBegan:touches withEvent:event];
}


-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesMoved:touches withEvent:event];

    if ([touches count] == 2 && swipeUp) {

        CGPoint nowPoint = [[touches anyObject] locationInView:self];
        CGPoint prevPoint = [[touches anyObject] previousLocationInView:self];

        if( nowPoint.x <= prevPoint.x && nowPoint.y <= prevPoint.y){
        }
        else {
            swipeUp = NO;
        }
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesEnded:touches withEvent:event];
    CGPoint nowPoint = [[touches anyObject] locationInView:self];

    if ([touches count] == 2 && swipeUp && nowPoint.x <= DELTA_X && nowPoint.y <= DELTA_Y) {
        NSLog(@"Invoke Method");
    }
    swipeUp = NO;
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesCancelled:touches withEvent:event];
    swipeUp = NO;
}
于 2012-07-29T07:13:00.327 に答える
0

考えられる解決策の 1 つは、スワイプが開始される可能性がある iPhone の画面上の座標グループと、スワイプが終了する可能性がある別の座標グループをマッピングすることです。次に、メソッドtouchesBegan:touchesMoved:メソッドで、スワイプの開始点と終了点を比較し、それが対角線として適格かどうかを判断できます。

于 2012-07-29T06:58:25.410 に答える