1

2 つの異なる位置に 2 つのラベルがあり、両方のラベルが同時にタップされたときに、別のラベルに成功メッセージを表示したい。

画像を参照してください:

どうすればこれを達成できますか? 1 回または複数回の指タッチによるシングル タップまたはダブル タップは認識できますが、これは別のシナリオです。助けてください。これを試しましたが、うまくいきません。

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
        tapRecognizer.numberOfTapsRequired = 1;
        tapRecognizer.numberOfTouchesRequired = 2;
        tapRecognizer.delegate = self;
        [self.view addGestureRecognizer:tapRecognizer];

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if (touch.view == tap2 && touch.view == tap1)
    {
        result.text = @"success";
    }
    return YES;
}

前もって感謝します。

4

2 に答える 2

2

検出しようとしているのは、実際には単一のジェスチャーではありません。

各ボタンにタップジェスチャ認識機能を追加することをお勧めします。ハンドラーは次のことを行います。

  1. タップの時刻を保存します (ハンドラーが呼び出された瞬間)
  2. この時間を、他のボタンが最後にタップされた時間と比較します。時間が非常に似ている (おそらく 0.25 秒離れている) 場合は、両方が同時にタップされたと考えて、それに応じて反応します。

実際のデバイスで時間間隔を試して、理想的な量を見つけてください。

アップデート:

明らかにテストされていないコードスニペット:

- (void)handleButton1Tap:(UITapGestureRecognizer *)sender  {
    if (sender.state == UIGestureRecognizerStateEnded)
    {
        self.button1TapTime = CACurrentMediaTime();
        [self testForSimultaneousTap];
    }
}

- (void)handleButton2Tap:(UITapGestureRecognizer *)sender  {
    if (sender.state == UIGestureRecognizerStateEnded)
    {
        self.button2TapTime = CACurrentMediaTime();
        [self testForSimultaneousTap];
    }
}

- (void)testForSimultaneousTap
{
    if (fabs(self.button1TapTime - self.button2TapTime) <= 0.2)
    {
        // Do stuff
    }
}

ここで、self.button1TapTime と self.button2TapTime はメンバー変数 (double) です。

ティム

于 2012-10-03T12:31:22.543 に答える
0

正式には、用語の回答を最初に受け入れましたが、それもうまくいきましたが、このプロセスに対するより簡単な解決策を見つけました。2 つのジェスチャ レコグナイザは必要ありません。タッチ数が 2 の単純なタップ ジェスチャ レコグナイザで実現できます。コードは次のとおりです。

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    tapRecognizer.numberOfTapsRequired = 1;
    tapRecognizer.numberOfTouchesRequired = 2;
    tapRecognizer.delegate = self;
    [self addGestureRecognizer:tapRecognizer];

これで、ハンドル タップ メソッドでは、UIGestureRecognizer クラスのインスタンス メソッドである「 locationOfTouch:inView: 」によって、2 つのタッチ ポイントを簡単に取得できます。したがって、このhandleTap:メソッドでは、2 つのタッチ ポイントが目的の場所にあるかどうかを確認する必要があります。コードは次のとおりです。

-(void)handleTap:(UITapGestureRecognizer*)recognizer
{
    if (recognizer.state == UIGestureRecognizerStateEnded)
    {
        CGPoint point1 = [recognizer locationOfTouch:0 self];
        CGPoint point2 = [recognizer locationOfTouch:1 self];

        if ([self validateTapIn:point1 and:point2])
        {
            resultLabel.text = @"success";
        }
    }
}

-(BOOL)validateTapIn:(CGPoint)point1 and:(CGPoint)point2
{
    return
    (CGRectContainsPoint(label1.frame, point1) && CGRectContainsPoint(label2.frame,:point2)) ||
    (CGRectContainsPoint(label1.frame, point2) && CGRectContainsPoint(label2.frame, point1));
}
于 2012-10-12T06:39:57.590 に答える