2013-02-06 3 views
7

Gibt es eine Möglichkeit, den Typ von Berührungsgesten zu erhalten, der ein UIEvent ausgelöst hat? Nehmen wir an, ich nehme eine Geste mit hitTest ab: withEvent :. Wie erkenne ich, welche Art von Berührung (Pinch, Tap, Swipe, etc.) passiert ist, die diese Methode ausgelöst hat?Identifizieren des Typs von Berührungsgesten von UIEvent Objekt

ich die Art von Remote-Ereignissen aus dem UIEvent Subtyp gewinnen kann, und auch wenn das Gerät geschüttelt wurde, aber es gibt keinen Parameter für Touch-Ereignisse ...

Wie erkennen Sie die?

+0

@blub: eigentlich ist es kein Duplikat - die Frage ist hier über geringe Berührungserkennung in hitTest: withevent: – sergio

+0

möglich „mein Fehler, sorry“ – blub

Antwort

5

Sie müssen die Touch-Analyse selbst durchführen.

Es ist nicht so schwierig, aber es ist nicht für Sie getan. Hier ein Beispiel aus irgendeinem Code, den ich tatsächlich benutze. Es ist nicht als umfassende Lösung gedacht. Es erkennt nur grundlegende Antippen/Streichen/Prise Gesten in einem sehr konkreten Kontext (der meiner App) und verwendet einen eher uncool Mechanismus, um die Gesten (Benachrichtigungen) zu liefern. Also, könnte es für Ihren Fall oder eher nicht gelten, aber ich hoffe, es gibt Ihnen eine Vorstellung davon, was erforderlich ist.

NSSet* allTouches = [event allTouches]; 
UITouch* touch = [allTouches anyObject]; 
UIView* touchView = [touch view]; 

     if (touch.phase == UITouchPhaseBegan) { 

      _initialView = touchView; 
      startTouchPosition1 = [touch locationInView:self]; 
      startTouchTime = touch.timestamp; 

      if ([allTouches count] > 1) { 
       startTouchPosition2 = [[[allTouches allObjects] objectAtIndex:1] locationInView:self]; 
       previousTouchPosition1 = startTouchPosition1; 
       previousTouchPosition2 = startTouchPosition2; 
      } 
     } 

     if (touch.phase == UITouchPhaseMoved) { 

      if ([allTouches count] > 1) { 
       CGPoint currentTouchPosition1 = [[[allTouches allObjects] objectAtIndex:0] locationInView:self]; 
       CGPoint currentTouchPosition2 = [[[allTouches allObjects] objectAtIndex:1] locationInView:self]; 

       CGFloat currentFingerDistance = CGPointDist(currentTouchPosition1, currentTouchPosition2); 
       CGFloat previousFingerDistance = CGPointDist(previousTouchPosition1, previousTouchPosition2); 
       if (fabs(currentFingerDistance - previousFingerDistance) > ZOOM_DRAG_MIN) { 
        NSNumber* movedDistance = [NSNumber numberWithFloat:currentFingerDistance - previousFingerDistance]; 
        if (currentFingerDistance > previousFingerDistance) { 
//       NSLog(@"zoom in"); 
         [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_ZOOM_IN object:movedDistance]; 
        } else { 
//       NSLog(@"zoom out"); 
         [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_ZOOM_OUT object:movedDistance]; 
        } 
       } 
      } 
     } 

     if (touch.phase == UITouchPhaseEnded) { 
      CGPoint currentTouchPosition = [touch locationInView:self]; 

      // Check if it's a swipe 
      if (fabsf(startTouchPosition1.x - currentTouchPosition.x) >= SWIPE_DRAG_HORIZ_MIN && 
       fabsf(startTouchPosition1.x - currentTouchPosition.x) > fabsf(startTouchPosition1.y - currentTouchPosition.y) && 
       touch.timestamp - startTouchTime < 0.7) 
      { 
       // It appears to be a swipe. 
       if (startTouchPosition1.x < currentTouchPosition.x) { 
         NSLog(@"swipe right"); 
        [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_SWIPE_RIGHT object:self]; 
       } else { 
         NSLog(@"swipe left"); 
        [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_SWIPE_LEFT object:self]; 
       } 
      } else { 
       //-- else, check if it's a single touch 
       if (touch.tapCount == 1) { 
        NSDictionary* uInfo = [NSDictionary dictionaryWithObject:touch forKey:@"touch"]; 
        [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_TAP object:self userInfo:uInfo];       
       }/* else if (touch.tapCount > 1) { 
        handle multi-touch 
       } 
       */ 
      } 

      startTouchPosition1 = CGPointMake(-1, -1); 
      _initialView = nil; 
     } 

     if (touch.phase == UITouchPhaseCancelled) { 
      _initialView = nil; 
//   NSLog(@"TOUCH CANCEL"); 
     } 
+0

ich werde es einen Testlauf und Bericht zurück in einer kleinen Weile. Vielen Dank! – user1799795

+0

Bitte bedenken Sie, dass mein Code nur ein Ausschnitt ist: Er ist nicht als vollständige Lösung gedacht. Es erkennt nur grundlegende Antippen/Streichen/Prise Gesten in einem sehr konkreten Kontext (der meiner App) und verwendet einen eher uncool Mechanismus, um die Gesten (Benachrichtigungen) zu liefern. Ich hoffe, es gibt Ihnen eine Vorstellung davon, was erforderlich ist. – sergio

+0

Ich bin mir dessen bewusst. :) – user1799795

0

Sie müssen die Berührungen (die Anzahl der Berührungen und ihre Position) selbst analysieren. Ein weiterer einfacher Weg besteht darin, einen entsprechenden Gestenerkenner hinzuzufügen, um den entsprechenden Typ zu erhalten. Der Ereignistyp für alle Berührungsereignisse ist UIEventSubtypeNone.

Verwandte Themen