2012-12-21 11 views
6

Sto avendo alcuni problemi cercando di implementare un pizzico di 3 dita.Tre dita pizzico gesto

Ho usato un pizzico 2 dita con una rotazione di 2 dita, individualmente! (nessun gesto simultaneo è necessario o voluto) il problema è che molte volte il sistema identifica il movimento sbagliato perché entrambi sono molto simili, quindi finisco per dover rimuovere le dita e premere di nuovo per cercare di far identificare il sistema la rotazione (di solito identifica il pizzico prima)

ho cercato un sacco per vedere se il delayBegin avrebbe aiutato, o se avrei potuto fare qualcosa di attivare il gesto simultanea, ma nessuno ha lavorato bene, quindi la mia idea era quella invece di utilizzare 2 dita per pizzicare, potrei usare 3 (dal momento che è più facile da pizzicare che ruotare).

Il problema è che, come sai, Pizzico funziona solo con 2 dita. Così ho deciso di creare una sottoclasse dello UIPinchGestureReconizer e di farlo funzionare solo quando sullo schermo sono presenti 3 dita. Il resto potrebbe funzionare mentre il pizzico standard funziona, ignorando anche il terzo dito (per calcolare la scala) ma assicurandosi che il terzo dito sia ancora sullo schermo.

così ho provato la seguente implementazione per i miei ThreeFingerPinchRecognizer (che le classi Sub il 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]; 
} 

Quindi, come potete vedere, sto cercando di ottenere la stessa funzionalità del pinch 2 dito (da solo chiamando i [super] funzioni e ai touchesBegan e touchesMoved funzioni, sto testando se c'è 3 dita sullo schermo (guardando il event.alltouches.count)

con questo, la rotazione sta lavorando perfetto con le due dita, ma il pizzico è n ot lavorando molto bene, la sua difficile per attivarla e quando lo fa, non funziona come il pinch due dita ...

So che può essere fatto questo del tutto sbagliato, quindi ogni aiuto sarà grande !!

Grazie mille!

+0

approccio Intersting, ma il PinchGestureRecognizer (che alla fine si invoca) probabilmente si aspetta 2 tocchi non 3, avrei forse cercare di rimuovi uno dei tocchi prima di chiamare super..hai intenzione di capire quale rimuovere però .. – Daniel

+0

Ho creduto che sia gestito all'interno del PinchGesture, dal momento che non sto cambiando nulla nell'evento che viene passato, Lo sto solo inoltrando! se rimuovo il "se", pizzico funziona correttamente (ma con 2 dita) –

+0

* Una buona nota: le funzioni a 3 dita non funzioneranno sui dispositivi degli utenti che hanno attivato lo zoom nelle impostazioni (una funzione Apple in cui si tocca due volte lo schermo con 3 dita per ingrandire (in qualsiasi app, proprio come la funzione di screenshot funziona in qualsiasi app)) ... L'uso di una capacità di rilevamento 3 più fine per le app potrebbe essere letale come utilizzare una funzione di rilevamento dei pulsanti di casa. (Io, insieme a molti altri ho abilitato questa funzione di zoom) –

risposta

0

Vedere questo frammento può aiutare u identificare lo stato di pinch:

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; 
    } 
} 
Problemi correlati