2012-12-21 24 views
6

Ich habe einige Probleme versuchen, eine 3-Finger-Pinch zu implementieren.Drei-Finger-Pinch-Geste

Ich habe eine 2-Finger-Prise mit einer 2-Finger-Rotation verwendet, individuell! (Keine gleichzeitige Geste benötigt oder gewünscht) Das Problem ist, dass das System oft die falsche Bewegung identifiziert, weil beide sehr ähnlich sind, so dass ich am Ende meine Finger entfernen und erneut drücken muss, um das System identifizieren zu lassen die Drehung (normalerweise identifiziert es die Prise zuerst)

Ich suchte viel, um zu sehen, ob die delayBegin helfen würde, oder wenn ich etwas tun könnte, die simultane Geste aktivierend, aber keine funktionierte ok, so war meine Idee, anstatt zu verwenden 2 Finger zu kneifen, könnte ich 3 verwenden (da es leichter ist zu kneifen als rotieren).

Das Problem ist, wie Sie wissen, Pinch funktioniert nur mit 2 Fingern. Also entschied ich, ich könnte die UIPinchGestureReconizer Unterklasse und nur erlauben es zu arbeiten, wenn es 3 Finger auf dem Bildschirm gibt. Der Rest könnte funktionieren, wenn das Standard-Pinch funktioniert, sogar den dritten Finger ignorierend (um die Skala zu berechnen), aber sicher sein, dass der dritte Finger noch auf dem Bildschirm ist.

Also habe ich versucht, die folgende Implementierung für meine ThreeFingerPinchRecognizer (die Sub-Klassen der UIPinchGestureRecognizer)

@implementation GRThreeFingerPinchRecognizer 

-(id)initWithTarget:(id)target action:(SEL)action 
    { 
    self = [super initWithTarget:target action:action]; 
    if(self){ 
    } 
    return self; 
} 

- (void)reset 
{ 
    [super reset]; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    int numberOfTouches = event.allTouches.count; 
    if (numberOfTouches == 3) 
    { 
     [super touchesBegan:touches withEvent:event]; 
    } 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    int numberOfTouches = event.allTouches.count; 
    if (numberOfTouches == 3) 
    { 
     [super touchesMoved:touches withEvent:event]; 
    } 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
     [super touchesEnded:touches withEvent:event]; 
} 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesCancelled:touches withEvent:event]; 
} 

So, wie Sie sehen können, ich versuche, die gleiche Funktionalität der 2-Finger-Prise zu bekommen (durch nur den Aufruf der [super] Funktionen und an den touchesBegan und touchesMoved Funktionen, teste ich, ob es drei Finger auf dem Bildschirm ist (durch am event.alltouches.count suchen)

Damit die Rotation arbeitet perfekt mit den beiden Fingern, aber die Prise ist n ot funktioniert sehr gut, es ist schwer zu aktivieren, und wenn es tut, funktioniert es nicht wie die zwei Finger Prise ...

Ich weiß, ich kann das total falsch machen, so dass jede Hilfe wird gut sein !!

Vielen Dank!

+0

Intersting Ansatz, aber die PinchGestureRecognizer wahrscheinlich (die am Ende Sie aufrufen) erwartet 2 berührt nicht 3, würde ich vielleicht versuchen, Entfernen Sie eine der Berührungen, bevor Sie Super anrufen .. Sie werden herausfinden müssen, welche zu entfernen, aber .. – Daniel

+0

Ich glaubte, dass das in der PinchGesture behandelt wird, da ich nichts in dem Fall geändert werde, übergeben wird, Ich schicke es nur weiter! Wenn ich das "if" entferne, funktioniert das Pinch korrekt (aber mit 2 Fingern) –

+0

* Eine gute Anmerkung: 3-Finger-Funktionen funktionieren nicht auf Geräten mit aktiviertem Zoom in den Einstellungen (eine Apple-Funktion, bei der Sie doppelt auf den Bildschirm mit 3 tippen) Finger zum Vergrößern (in jeder App, ähnlich wie die Screenshot-Funktion in jeder App funktioniert)) ... Die Verwendung einer 3-facher Erkennung für die App-Funktion könnte so tödlich sein wie die Verwendung einer Home-Button-Erkennungsfunktion. (Ich, zusammen mit vielen anderen haben diese Zoom-Funktion aktiviert) –

Antwort

0

Sehen Sie diese Snippet helfen kann u den Staat pinch zu identifizieren:

if (pinch.numberOfTouches > 1) 
{ 
    CGPoint firstPoint = [pinch locationOfTouch:0 inView:self]; 
    CGPoint secPoint = [pinch locationOfTouch:1 inView:self]; 
    currentUpperY = MIN(firstPoint.y, secPoint.y); 
    if (previousY == 0) previousY = currentUpperY; 
    Float32 y = (self.contentOffset.y + previousY - currentUpperY); 
    [self setContentOffset:CGPointMake(0, y < 0 ? 0 : y) animated:NO]; 

    if (pinch.state == UIGestureRecognizerStateBegan) 
    { 
     pinchStarted = YES; 
     firstY = MIN(firstPoint.y, secPoint.y); 
     secondY = MAX(firstPoint.y, secPoint.y); 
     NSArray *pinchedIndexs = [self indexPathsForRowsInRect:CGRectMake(0.0, firstY, CGRectGetWidth(self.bounds), secondY)]; 
     if (pinchedIndexs.count) itemToOpenOrClose = [[currentItems subarrayWithRange:NSMakeRange(((NSIndexPath *)[pinchedIndexs objectAtIndex:0]).row, pinchedIndexs.count - 1)] copy]; 
    } 
} 

if ((pinch.state == UIGestureRecognizerStateChanged && pinchStarted && itemToOpenOrClose.count) 
    || pinch.state == UIGestureRecognizerStateEnded) 
{ 
    if (pinch.scale > 1) // Pinch OUT 
    { 
     for (Item *item in itemToOpenOrClose) 
     {     
      [self openItem:item inIndexPath:[NSIndexPath indexPathForRow:[currentItems indexOfObject:item] inSection:0]]; 
     } 
    } 
    else if (pinch.scale < 1) // Pinch IN 
    { 
     for (Item *item in itemToOpenOrClose) 
     { 
      [self closeItem:item inIndexPath:[NSIndexPath indexPathForRow:[currentItems indexOfObject:item] inSection:0]]; 
     } 
    } 

    if (pinch.state == UIGestureRecognizerStateEnded) 
    { 
     pinchStarted = NO; 
     itemToOpenOrClose = nil; 
     previousY = 0; 
    } 
}