2013-10-13 5 views
9

I report intermittenti degli utenti su iOS 7 mi dicono che il UIPanGestureRecognizer smette di funzionare su determinate visualizzazioni ogni tanto. Dovrebbero essere in grado di scorrere una vista a destra/sinistra, ma si interrompe e non funziona per qualche motivo sconosciuto. Forza la chiusura dell'app e il riavvio risolve il problema.UIPanGestureRecognizer a volte non funziona su iOS 7

Questo problema mai successo su iOS 6. E io non ho alcun codice che disattiva il sistema di riconoscimento gesto in qualsiasi momento, oltre l'gestureRecognizerShouldBegin delegato che costringe il gesto solo riconoscere pentole orizzontali:

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer { 

    if ([gestureRecognizer isMemberOfClass:[UIPanGestureRecognizer class]]) { 

     CGPoint translation = [gestureRecognizer translationInView:[self superview]]; 

     if (fabsf(translation.x) > fabsf(translation.y)) { 

      if (translation.x > 0) 
       return YES; 
     } 
    } 
    return NO; 
} 

Forse qualcosa cambia nel UIPanGestureRecognizer (o semplicemente nel semplice UIGestureRecognizer) che potrebbe causare questo problema?

+0

Hai verificato che il controllo 'x> y' non sta causando un'uscita anticipata durante i tempi in cui il riconoscitore di gesti sembra non funzionare? – RyanR

+0

Purtroppo non riesco nemmeno a riprodurre il bug su nessuno dei miei dispositivi, ma ho ricevuto abbastanza segnalazioni da parte degli utenti che so che non è solo un singolo utente che non sa cosa stanno facendo. – bmueller

+1

Devo accadere alcune volte adesso. Il 'gestureRecognizerShouldBegin' viene chiamato e restituisce' YES' correttamente, ma il metodo che assegno a 'UIPanGestureRecognizer' NON viene chiamato. Quindi riconosce il gesto ma non chiama il metodo ... – bmueller

risposta

12

Penso di aver finalmente risolto questo problema. Apparentemente iOS 7 gestisce i gesti nelle sottoview in modo diverso rispetto a iOS 6 e versioni precedenti. Per gestire questo, Apple ha implementato un nuovo delegato:

(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 

Se si torna SI, che dovrebbe ottenere il vostro sistema di riconoscimento gesto di lavorare. L'ho implementato e non ho avuto problemi fino ad ora (anche se devo ammettere che si trattava di un bug raro che non avrei mai potuto riprodurre in modo affidabile, quindi è possibile che non sia ancora riapparso).

Per ulteriori informazioni, vedere https://stackoverflow.com/a/19892166/1593765.

+1

Impressionante cattura! Grazie! :-) – kernix

+0

Ho anche questo bug con UIPanGestureRecognizer, la direzione non funziona in left/right delegate return sempre NO, in alcune immagini gentili, non riesco a trovare spiegazioni (ma quando cambio metodo delegate su questa risposta tutto funziona.) Grazie ! –

+0

Consiglio fantastico! Passa un paio d'ore su questo! –

0

Perché dovresti restituire NO nel riconoscimento dei gesti solo perché su gestureRecognizerShouldBegin: il movimento è solo verticale? Poiché è un gesto fatto dall'utente con il suo dito (e non fatto da una macchina), ci sarà sempre un po 'di casualità nel suo movimento a causa dell'imprecisione del dito in movimento. gestureRecognizerShouldBegin: verrà chiamato subito dopo che l'utente ha toccato lo schermo e la traduzione ottenuta potrebbe essere solo di pochi pixel. Il tuo riconoscitore fallirà se l'utente, quando mette il dito sullo schermo, lo sposta di 2 pixel in alto, anche se poi lo sposta di 200 pixel a destra. Questo non dovrebbe causare la disattivazione permanente del riconoscitore di gesti, ma dovresti anche esaminarlo, poiché potrebbe confondere gli utenti quando i loro gesti non vengono riconosciuti per apparentemente senza motivo.