2013-10-01 7 views
12

私は私は2つの異なるジェスチャーをするビューがあります。アクションBを行うには、アクションA. ダブルタップを行うためにUITapGestureRecognizerを使用してタップとダブルタップを同時に検出する方法は?例えば

タップを

問題は、私は最低限必要なタップ数を設定することができますUITapGestureRecognizerであります。シングルタップジェスチャ認識装置は、ダブルタップジェスチャ認識装置がダブルタップを認識する前にタップを認識する。

例:

_tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureRecognized:)]; 
_tapGestureRecognizer.numberOfTouchesRequired = 1; 
_tapGestureRecognizer.numberOfTapsRequired = 1; 
[self addGestureRecognizer:_tapGestureRecognizer]; 

_doubleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapGestureRecognized:)]; 
_doubleTapGestureRecognizer.numberOfTouchesRequired = 1; 
_doubleTapGestureRecognizer.numberOfTapsRequired = 2; 
[self addGestureRecognizer:_doubleTapGestureRecognizer]; 

それは常に私が非常に高速ダブルタップを行う場合でも、シングルタップを認識しています。タップジェスチャ認識装置が待機し、ダブルタップジェスチャ認識装置が認識するかどうかを確認するには、どうすれば設定できますか?

+0

可能な解決策と複製:http://stackoverflow.com/questions/7175086/iphone-single-tap-gesture-conflicts-with-doubleone – xarly

+0

遅延を削除するか、調整してください。 http://stackoverflow.com/a/25368653/3060790 – Pagly

答えて

42

私が以前のプロジェクトで使用したことは、これがあなたの人生を助けることを願っています。

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]; 
+0

パーフェクト!どうもありがとうございました! – openfrog

+9

これは動作しますが、シングルタップの場合はシングルタップのコールで遅延が発生します – Mrug

+1

^^誰かこの遅延の解決策を見つけましたか? – barfoon

-1

私は、Xcode Monkeyの答えを使ってシングルタップの遅延に対する解決策を見出しました。この方法を使用すると、1タップと2タップの間にしきい値をミリ秒単位で設定できます。この技術では、シンプルなUIButtonとNSTimerを使用して、シングルタップとダブルタップを区別します。 SWIFT 3及び迅速な4オン

@property NSTimer  *tapTimer; 
@property BOOL   isDoubleTap; 

    UIButton *yourButton = [UIButton new]; 
    yourButton.frame = // set your frame 
    [yourButton addTarget:self action:@selector(handleTap:) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view yourButton]; 


-(void)handleTap:(UIButton*)button 
{ 
    [self.tapTimer invalidate]; 

    if (self.isDoubleTap) 
    { 
    [self doDoubleTap]; 
    return; 
    } 
    self.isDoubleTap = YES; 
    // CHANGE THE 0.3 SECOND THRESHOLD BETWEEN SINGLE/DOUBLE TAP TO YOUR HEART'S CONTENT 
    self.tapTimer = [NSTimer scheduledTimerWithTimeInterval:0.3 target:self selector:@selector(doSingleTap) userInfo:nil repeats:NO]; 
} 

-(void)doSingleTap 
{ 
    self.isDoubleTap = NO; 
} 

-(void)doDoubleTap 
{ 
    self.isDoubleTap = NO; 
} 
+0

遅れが改善されず、ユーザーが複数のセルを0.3秒未満でクリックすると潜在的な問題が発生する – ChuckKelly

+0

重大な(0.2)遅延を維持する必要があります。 – Jeet

5

let singleTap = UITapGestureRecognizer(target: self, action: #selector(doSingleTap)) 
singleTap.numberOfTapsRequired = 1 

self.view.addGestureRecognizer(singleTap) 

let doubleTap = UITapGestureRecognizer(target: self, action: #selector(doDoubleTap)) 
doubleTap.numberOfTapsRequired = 2 

self.view.addGestureRecognizer(doubleTap) 

singleTap.require(toFail: doubleTap) 
+0

私はsingleTap.require(toFail:doubleTap)の代わりにsingleTap.requireGestureRecognizerToFail(doubleTap)を使用します。 – Marcos

+0

答えはSwift 3 @Marcos – Logan

0
{ UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleDoubleTapGesture:)]; 
     [doubleTap setDelegate:self]; 
     doubleTap.numberOfTapsRequired = 2; 
     [self.headerView addGestureRecognizer:doubleTap]; 

     UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleSingleTapGesture:)]; 
     singleTap.numberOfTapsRequired = 1; 
     [singleTap setDelegate:self]; 
     [doubleTap setDelaysTouchesBegan:YES]; 
     [singleTap setDelaysTouchesBegan:YES]; 
     [self.headerView addGestureRecognizer:singleTap]; 
    } 
     - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ 
      return YES; 
     } 

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ 
     return YES; 
    } 

したい任意のメソッド内のジェスチャ認識装置を作成します。たとえば、あなたがのtableViewであなたのheaderViewのためのジェスチャーをタップしたい場合は、

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 

の中にあるものをタップジェスチャーを作成し、クラスがUIGestureRecognizerDelegateを実装する必要があります。 上記のデリゲートクラスの2つのメソッドがあります。

+0

です。回答の質が大幅に改善されることがあります。 – mrun

関連する問題