164

ビューに2つ追加しようとしUITapGestureRecognizersています。1つはシングルタップ用、もう1つはダブルタップイベント用です。シングルタップレコグナイザーは、(それ自体で)期待どおりに機能しています。しかし、ダブルタップレコグナイザーを機能させることができないようです。

cancelsTouchesInView:のようなプロパティを試してみましたがdelaysTouchesBegandelaysTouchesEndedそれでも機能しません。

ダブルタップすると、シングルタップレコグナイザーが常にアクティブになり、ダブルタップイベントもスーパービューに送信されます。しかし、カスタムダブルタップレコグナイザーはまったく通知されていないようです。

ドキュメントは、上記の3つのプロパティを目的に使用できることを示唆しているようです。しかし、どの値をどのレコグナイザー(シングル、ダブル、または両方)に設定する必要があるのか​​わかりません。これに精通している誰かが助けてくれることを願っています。

以下は、最新の更新されたコードブロックです。

// ****** gesture recognizers ******

- (void)addSingleAndDoubleTapGestureRecognizersToView:(UIView *)view
{
    // single tap    
    UITapGestureRecognizer *singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: tableViewController action: @selector(handleSingleTapOnView:)];                                 
    [singleTapRecognizer setNumberOfTouchesRequired:1];
    [view addGestureRecognizer: singleTapRecognizer];

    // double tap 
    UITapGestureRecognizer *doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: tableViewController action: @selector (handleDoubleTapOnView:)];        
    [doubleTapRecognizer setNumberOfTouchesRequired:2];         
    [singleTapRecognizer requireGestureRecognizerToFail: doubleTapRecognizer];
    [view addGestureRecognizer: doubleTapRecognizer];         
}

- (void)handleSingleTapOnView:(id)sender
{

}

- (void)handleDoubleTapOnView:(id)sender
{

}
4

9 に答える 9

444
UITapGestureRecognizer *singleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doSingleTap)] autorelease];
singleTap.numberOfTapsRequired = 1; 
[self.view addGestureRecognizer:singleTap];

UITapGestureRecognizer *doubleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doDoubleTap)] autorelease];
doubleTap.numberOfTapsRequired = 2; 
[self.view addGestureRecognizer:doubleTap];

[singleTap requireGestureRecognizerToFail:doubleTap];

注: 使用 numberOfTouchesRequired している場合は、 .numberOfTouchesRequired = 1;

スイフト用

let singleTapGesture = UITapGestureRecognizer(target: self, action: #selector(didPressPartButton))
singleTapGesture.numberOfTapsRequired = 1
view.addGestureRecognizer(singleTapGesture)

let doubleTapGesture = UITapGestureRecognizer(target: self, action: #selector(didDoubleTap))
doubleTapGesture.numberOfTapsRequired = 2
view.addGestureRecognizer(doubleTapGesture)

singleTapGesture.require(toFail: doubleTapGesture)
于 2012-01-16T06:04:32.723 に答える
32

requireGestureRecognizerToFail:メソッドを使用する必要があります。このようなもの:

[singleTapRecognizer requireGestureRecognizerToFail:doubleTapRecognizer];

于 2012-01-16T05:57:50.517 に答える
15

//----まず、ダブルタップとシングルタップのジェスチャーを割り当てる必要があります-------//

UITapGestureRecognizer* doubleTap = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (handleDoubleTap:)];

UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (handleSingleTap:)];

[singleTap requireGestureRecognizerToFail : doubleTap];
[doubleTap setDelaysTouchesBegan : YES];
[singleTap setDelaysTouchesBegan : YES];

//-------------------------------------タップ数----------------//

[doubleTap setNumberOfTapsRequired : 2];
[singleTap setNumberOfTapsRequired : 1];

//-------- ビューまたはボタンにダブルタップとシングルタップのジェスチャーを追加--------//

[self.view addGestureRecognizer : doubleTap];
[self.view addGestureRecognizer : singleTap];
于 2012-07-26T12:56:38.077 に答える
10

それがまさにあなたが探しているものかどうかはわかりませんが、ジェスチャ認識機能なしでシングル/ダブルタップを行いました. 私はUITableViewで使用しているので、didSelectRowAtIndexPathメソッドでそのコードを使用しました

    tapCount++;
    switch (tapCount)
    {
        case 1: //single tap
            [self performSelector:@selector(singleTap:) withObject: indexPath afterDelay: 0.2];
            break;
        case 2: //double tap
            [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(singleTap:) object:indexPath];
            [self performSelector:@selector(doubleTap:) withObject: indexPath];
            break;
        default:
            break;
    }
    if (tapCount>2) tapCount=0;

メソッド singleTap と doubleTap は、パラメーターとして NSIndexPath を使用すると無効になります。

- (void)singleTap:(NSIndexPath *)indexPath {
  //do your stuff for a single tap
}

- (void)doubleTap:(NSIndexPath *)indexPath {
  //do your stuff for a double tap
}

それが役に立てば幸い

于 2012-01-17T09:26:04.610 に答える
-1

@stanleyのコメントを参照して-

タップ ジェスチャを使用して選択範囲を行ないでください。UITableView既に完全なタップ処理が行われているためです。

ただし、シングル タップ ジェスチャ レコグナイザで [ビュー内のタッチをキャンセル] を [いいえ] に設定する必要があります。そうしないと、タップ イベントが取得されません。

于 2014-07-09T15:57:54.457 に答える