2013-10-01 9 views
12

Per esempio io ho una visione dove voglio due gesti differenti:Come rilevare tocco e doppio tocco contemporaneamente utilizzando UITapGestureRecognizer?

rubinetto per fare azione A. doppio tap per fare azione B.

il problema è con UITapGestureRecognizer posso solo impostare minimo richiesto conteggio del rubinetto . Il riconoscitore di gesti con un solo tocco riconosce un tocco prima che il doppio gesto del riconoscimento del gesto riconosca il doppio tocco.

Esempio:

_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]; 

Essa riconosce sempre il singolo rubinetto, anche se faccio doppio tap molto veloce. Come posso configurarlo in modo che il riconoscitore del gesto di tocco sia in attesa e veda se riconosce il riconoscimento del gesto del doppio tocco?

+0

Soluzione possibile e duplicata: http://stackoverflow.com/questions/7175086/iphone-single-tap-gesture-conflicts-with-double-one – xarly

+0

Prova a rimuovere il ritardo oa regolarlo a piacere. http://stackoverflow.com/a/25368653/3060790 – Pagly

risposta

42

Ecco quello che ho usato in uno dei miei vecchi progetti, spero che ti aiuta l'uomo.

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

Perfetto! Grazie mille! – openfrog

+9

funziona ma, per Single Tap fa ritardare la chiamata di un singolo tap – Mrug

+1

^^ Qualcuno ha trovato una soluzione a questo ritardo? – barfoon

-1

Ho trovato una soluzione al ritardo del singolo tocco utilizzando la risposta di XCode Monkey. Utilizzando questo approccio, è possibile configurare in mili-secondi la soglia tra un singolo e un doppio tocco. Questa tecnica utilizza un semplice UIButton e un NSTimer per distinguere tra single e double tap.

@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

Nessun miglioramento in ritardo e crea potenziali problemi con gli utenti facendo clic su più celle in meno di .3 secondi – ChuckKelly

+0

O si deve mantenere una significativa (0,2) ritardo o rilevamento altro doppio tocco non riesce a registrare prima dello scadere del timer singolo rubinetto. – Jeet

5

su SWIFT 3 e veloce 4:

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

Io uso singleTap.requireGestureRecognizerToFail (doubleTap) invece di singleTap.require (toFail: doubleTap) – Marcos

+0

La risposta è per 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; 
    } 

Creare i sistemi di riconoscimento dei gesti all'interno di qualsiasi metodo che si desidera. Per esempio, se si desidera toccare gesti per il vostro headerView in tableView creano quei gesti tap all'interno

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

E la classe dovrebbero attuare UIGestureRecognizerDelegate. Sopra menzionati sono i 2 metodi di quella classe delegata.

+0

Alcune spiegazioni potrebbero migliorare significativamente la qualità della risposta. – mrun