2013-10-01 4 views
12

Zum Beispiel habe ich einen Blick, wo ich zwei verschiedene Gesten will:Wie erkennen und tippen Sie gleichzeitig mit UITapGestureRecognizer?

Hahn Aktion A. doppeltes Tippen zu tun Aktion B. mit UITapGestureRecognizer

Das Problem, das ich nur einstellen Mindest tap Zahl erforderlich ist, zu tun . Der Einzeltipp-Gestenerkenner erkennt ein Antippen, bevor der Doppeltipp-Gestenerkenner den Doppeltipp erkennt.

Beispiel:

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

Er erkennt immer den einzigen Hahn, auch wenn ich sehr schnell doppelt tippen tun. Wie kann ich es einrichten, so dass der Tippgeste-Erkenner wartet und sieht, ob der Doppeltipp-Gestenerkenner erkennt?

+0

Mögliche Lösung und dupliziert: http://stackoverflow.com/questions/7175086/iphone-single-tap-gesture-conflicts-with-double-one – xarly

+0

Versuchen Sie dies, um die Verzögerung zu entfernen oder anzupassen, die Sie möchten. http://stackoverflow.com/a/25368653/3060790 – Pagly

Antwort

42

Hier ist, was ich in einem meiner alten Projekte verwendet habe, ich hoffe es hilft dir Mann.

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

Perfekt! Vielen Dank! – openfrog

+9

dies funktioniert, aber für Single Tap es Verzögerung bei Anruf von Single Tap – Mrug

+1

^^ Hat jemand eine Lösung für diese Verzögerung herausgefunden? – barfoon

-1

Ich habe eine Lösung für die Verzögerung der einzelnen Tippen mit XCode Monkey's Antwort gefunden. Mit diesem Ansatz können Sie in Millisekunden den Schwellenwert zwischen einem einfachen und einem doppelten Antippen konfigurieren. Diese Technik verwendet eine einfache UIB-Taste und einen NSTimer, um zwischen Einzel- und Doppeltippen zu unterscheiden.

@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

Keine Verbesserung der Verzögerung UND verursacht potentielle Probleme, wenn Benutzer innerhalb von weniger als 0,3 Sekunden auf mehrere Zellen klicken – ChuckKelly

+0

Sie müssen entweder eine signifikante (0,2) Verzögerung beibehalten oder die Doppeltippenerkennung kann nicht registriert werden, bevor der Einzeltippen-Timer abläuft. – Jeet

5

Auf schnellen 3 und schnelle 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

Ich benutze singleTap.requireGestureRecognizerToFail (DoubleTap) statt singleTap.require (Tofail: DoubleTap) – Marcos

+0

Die Antwort ist für 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; 
    } 

Erstellen Sie die Geste Erkenner in jede Methode, die Sie wollen. Wenn Sie zum Beispiel möchten, tippen Sie Gesten für Ihre headerView in Tableview jene tap Gesten innerhalb

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

erstellen und Ihre Klasse sollte UIGestureRecognizerDelegate implementieren. Oben erwähnt sind die 2 Methoden dieser Delegate-Klasse.

+0

Einige Erklärungen würden die Qualität Ihrer Antwort deutlich verbessern. – mrun