24/7 twenty-four seven

iOS/OS X application programing topics.

iPhoneのタッチイベントで、シングルタップを無視してダブルタップのイベントだけ拾う方法。

iPhoneの画面でシングルタップとダブルタップで全く別の動作をさせたいときや、ダブルタップにだけ反応して、シングルタップは無視したいようなときがあります。
しかし、単純にtapCountによって処理を分けようとすると、"[touch tapCount] == 2"の処理の前に"[touch tapCount] == 1"の処理が動いてしまいます。
touchesEnded:withEvent:が2回呼ばれて、1回目にシングルタップの処理、2回目にダブルタップの処理、という具合に動くからです。


調べたところ、以下のコードでだいたいうまく動くので紹介します。


1回目のタッチイベントでは実際の処理はせず、タイマーで0.25秒後に動くように、シングルタップの処理を登録しておきます。
そのあと、間髪を入れずにタッチイベントが発生して、タップカウントが2のときは、登録したシングルタップの処理をキャンセルし、ダブルタップの処理をします。
ダブルタップされなかった場合は、タイマーに登録したシングルタップの処理が発火します。


シングルタップの動きは、ほんの少し遅れることになりますが、アプリケーション内がすべて同様の処理で統一されていれば気になりませんでした。

"Ask Dev" - iPhone Dev SDK

- (void)mySingleClickMethod:(UITouch *)touch
{
    // perform single click action
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    if([touch tapCount] == 1)
    {
        // schedule "mySingleClickMethod" to be called with the touch object
        // in 0.25 seconds unless I cancel it first.

        [self performSelector:@selector(mySingleClickMethod:) withObject:touch afterDelay:0.25];
        return;  // nothing left to do until either a second click or 0.25 seconds
    }

    if ([touch tapCount == 2)
    {
        // cancel the scheduled call to "mySingleClickMethod"
        [NSObject cancelPreviousPerformRequestsWithTarget:self];

        // now perform the double click action
    }
}