2010-10-26 6 views
5

Attualmente sto avendo alcuni conflitti con UIGestureRecognizers che sta facendo sì che tutto rimanga piacevole l'uno con l'altro. Ho diversi quadrati (UIView) sullo schermo che consentono all'utente di eseguire una panoramica e un pizzico (utilizzato per ridimensionare le viste). Ho aggiunto un UIPinchGestureRecognizer alla vista principale che i quadrati sono aggiunti in modo che possa ridimensionare il quadrato a fuoco. Ho anche aggiunto UIPanGestureRecognizers a ogni quadrato in modo che possa essere spostato sullo schermo. Il problema si manifesta quando pizzico per scalare un quadrato selezionato mentre le mie dita si muovono attraverso le altre. Basato sul mio debugging, sembra che se le mie dita pizzicanti attraversano i quadrati non focalizzati, mangiano i tocchi che annullano il gesto di pizzicamento. L'utilizzo di "[pan requireGestureRecognizerToFail: pinch]" fornisce la priorità di pinch ma crea e genera perché il riconoscitore di panoramica continua non viene più attivato. Ho anche provato ad aggiungere UIPinchRecognizer direttamente al quadrato ma funziona ma il gesto ha il vincolo di essere entro i limiti del quadrato che non funziona bene se il quadrato viene ridimensionato troppo. C'è un modo per aggirare questo? Mi sto perdendo qualcosa?iPhone - Conflitti con più UIGestureRecognizers

+0

l'applicazione suona simile al [Touches_GestureRecognizers] (http://developer.apple.com/library/ios/#samplecode/Touches/Introduction/Intro.html%23//apple_ref/ doc/uid/DTS40007435) esempio di app di Apple. Fa la stessa cosa con i quadrati e non sembra avere lo stesso problema. – Anna

+0

@ aBitOvious: Grazie, il codice di esempio è in realtà piuttosto buono. @ Tim: Non sto impostando il delegato in questo momento, quindi ne esaminerò sicuramente la questione poiché dovrebbe consentire di controllare chi mangia cosa. Ne saprò di più una volta che scaverò nella fonte. – Dave

+0

Ho appena unito tutti e sei i tuoi account basati sui cookie (e ho ripulito tutte le cose qui - la vita di un bidello non è mai facile). Si prega di considerare la registrazione di questo account. – Will

risposta

3

Un modo per aggirare il problema sarebbe quello di impostare un unico delegato comune per tutti i tuoi UIGestureRecognizers (probabilmente l'UIViewController per questa vista). Questo delegato potrebbe restituire NO per gestureRecognizerShouldBegin: (UIGestureRecognizer *) gestureRecognizer se il riconoscimento del gesto pizzico era negli stati "Iniziato" o "Modificato" (significa che riconosceva ed elaborava un pizzico). Ciò dovrebbe impedire a nessuno dei riconoscitori dei gesti di pan di mangiare tocchi durante un gesto di pizzicamento.

Nel file di interfaccia, avrete bisogno di salvare un riferimento al sistema di riconoscimento pizzico gesto:

@interface MyViewController : UIViewController <UIGestureRecognizerDelegate> { 
    UIGestureRecognizer *pinchGestureRecognizer; 
} 

E nella realizzazione, assicuratevi di controllare lo stato del riconoscitore pizzico gesto, non lo stato del gesto riconoscitore viene passata:

@implementation MyViewController 

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 
{ 
    if(pinchGestureRecognizer.state == UIGestureRecognizerStateBegan || 
    pinchGestureRecognizer.state == UIGestureRecognizerStateChanged) 
    { 
    return NO; 
    } 
    else 
    { 
    return YES; 
    } 
} 
+0

@ Tim: Ha funzionato alla grande! Immagino di avere troppi altri scenari che mi girano per la testa e che per qualche ragione non è stato quello di chiarirmi, ma ha perfettamente senso. Molte grazie! A proposito, come rispondi alle risposte o modifica i tuoi post? Devi essere registrato? Sto solo usando i campi dei nomi. Grazie ancora. – Dave

+0

Consulta la domanda frequente sull'overflow dello stack "Cos'è la reputazione?" In poche parole, guadagni reputazione dagli altri utenti chiedendo e rispondendo a buone domande. A determinate soglie si guadagnano privilegi come la modifica e il commento. Hai già guadagnato qualche rappresentante (il 13 accanto al tuo nome) perché qualcuno ha "votato" questa domanda (la 1 accanto alla tua domanda). –

+0

In realtà, dal momento che hai posto questa domanda dovresti essere in grado di commentare qualsiasi risposta con il link "aggiungi un commento" sotto ogni risposta, anche se non hai molti rappresentanti. Generalmente è così che le persone rispondono alle risposte invece di fare nuove risposte come hai fatto tu, ma non preoccuparti ... –