2012-01-13 15 views
5

Ho una radice UIScrollView che scorre solo verticalmente, questa vista a scorrimento rappresenta le righe nella mia griglia seghettata. Ho configurato il riconoscimento di movimento panoramico di questa vista a scorrimento per due tocchi per il numero minimo e massimo di tocchi richiesti.UIPanGestureRecognizer.maximumNumberOfTouches non rispettato nelle visualizzazioni di scorrimento nidificate?

All'interno di questa vista a scorrimento ho una o più istanze UIScrollView che scorre solo orizzontalmente, queste immagini a scorrimento rappresentano ciascuna una singola riga nella mia vista griglia frastagliata. Ho configurato i riconoscitori di movimento pan per tutte queste visualizzazioni di scorrimento per un minimo di un tocco e due tocchi al massimo.

Finora funziona, ottengo una bella vista a griglia frastagliata dove posso scorrere verticalmente tra le righe e orizzontalmente per scorrere ciascuna riga in modo indipendente. Ho intenzionalmente impostato il numero minimo di tocchi come 2, in modo da non temere con lo scorrimento se aggiungo per esempio a UITableView come sottoview per qualsiasi cella all'interno di questa vista a griglia frastagliata (cella == una posizione definita da una riga e una colonna in quella riga).

Utilizzando una UITableView come una cella funziona, la vista tabella funziona come previsto. Ma lo scrolling con due dita scorre anche all'interno della vista tabella, non nella vista scroll principale per lo scorrimento verticale tra le righe.

Ho provato a configurare le visualizzazioni di tabella pan gesture recognizer per consentire un massimo di un tocco, nella speranza che i due tocchi siano ignorati. Ciò non funziona, la proprietà maximumNumberOfTouches delle giunture di riconoscimento del gesto di spostamento pan della vista tabella deve essere ignorata.

Cosa avrei potuto fare di sbagliato?

Una schermata che visualizza il layout di chiarire quello che ho fatto: Jagged Grid View http://i44.tinypic.com/33u96yv.png

+0

Buona domanda. Sto risolvendo un problema simile. Gesto di scorrimento a 2 dita su una scrollview. Posso dare priorità al pantrecognizer ma lo scorrimento non è fluido perché durante il trascinamento, il sistema attende un po 'per vedere se non è un gesto di scorrimento. 'maximumNumberOfTouches' su panrecognizer non funziona :( – Sulthan

+0

tinypic dice che la foto è stata rimossa ... – nielsbot

risposta

0

scorrimento multipla tende ad ottenere difficile, e lo faccio non per sicuro, ma penso che Apple non incoraggia questo. Anche così, continuo a pensare che sia possibile. Può essere che lo scorrimento verticale nella vista tabella venga mescolato con lo scorrimento verticale della vista a scorrimento o qualcos'altro.

Provare a verificare se i delegati per i riconoscitori di gesti sono impostati correttamente. Un altro modo per aggirare questo è: - avere una vista di scorrimento con pulsanti, da cui è possibile aprire i popover con i controller personalizzati (inserire lì quello che vuoi). - crea un grande UITableViewController e imposta il contenuto della cella come immagini di scorrimento ecc. Penso che potresti ottenere lo stesso risultato.

Il mio consiglio è di non rimanere bloccato su un solo metodo, quando potrebbero esserci altri più semplici e intuitivi.

+0

I riconoscitori di gesti non sono miei, sono di proprietà delle visualizzazioni di scorrimento quindi non tocco i loro delegati e preferibilmente li tocchi il meno possibile sempre possibile L'intenzione generale è quella di implementare un nuovo tipo di controller della vista di contenimento.Le sottoview in ogni griglia, come ad esempio 'UITableViewController' nella piccola immagine di esempio, dovrebbero essere totalmente indipendenti dal controller della vista della griglia – PeyloW

0

Le visualizzazioni di tabelle nelle viste di scorrimento non sono generalmente una grande idea. Quando un TableView riceve i tocchi, anche se non ha bisogno di fare nulla con esso, non li invierà alla sua superView.

Si potrebbe desiderare di provare una di queste 2 cose:

  1. Nella tua TableView è necessario inviare i tocchi al vostro Superview manualmente e far loro gestire in modo appropriato. Ho visto questo metodo essere utilizzato in uno dei miei progetti collaterali, ma non sono in grado di postarne un esempio in questo momento.

  2. La seconda cosa potrebbe essere più semplice da implementare. Poiché TableView è una sottoclasse di ScrollView, puoi chiamare lo delaysContentTouches di quelle TableViews.La struttura, ritarderà il touch-down, anche su quella TableView fino a che non può determinare se lo scorrimento è l'intento, come è scritto nel AppleDocs: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIScrollView_Class/Reference/UIScrollView.html#//apple_ref/occ/cl/UIScrollView

fatemi sapere se uno dei 2 modi funziona per voi, Sono piuttosto curioso di questo argomento in generale.

+0

le tue soluzioni coinvolgono l'hacking nella vista figlio, che voglio evitare poiché rende il bambino dipendente dal genitore.Tutti i tocchi sono correttamente inoltrati alla superview, è solo che la vista tabella * ignora * il valore 'maximumNumberOfTouches 'di esso pan gesture recognizer, attivando un pan con due dita, anche se configurato per consentire un massimo di 1 dito. – PeyloW

+0

Non si è in grado di impostare anche le loro proprietà? –

0

Ma non provare alcuni trucchi piuttosto che attuare tutti questi cambiamenti:

1) Per impostazione predefinita, disattivare lo scorrimento del TableView quando viene creata la vista.

2) Una volta che la vista viene generato, riconoscere i gesti se la sua Scorrimento usando tocchi singoli o multipli, se l'utente tocca lo Scrollview.Look bambino fuori l'etichetta, sulla base di gesti, è possibile attivare lo scorrimento di Tableview.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    //Get the tag of ScrollView 
    // Check for the Parent as well as Child SCrollview. 
    // If its child, just enable the scrolling of tableView. 
} 

- (void)tapAction:(UIGestureRecognizer *)gestureRecognizer 
{ 

// CGPoint *poit = [Tile locationInView:gestureRecognizer.view]; 
/// [[[gestureRecognizers.view] objectAtIndex:0] removeFromSuperview]; 
// imageContent = [[UIImageView alloc]initWithFrame:CGRec tMake(0, 0, 200, 250)]; 
// [imageContent setImage:[UIImage imageNamed:@"Default.png"]]; 

    NSLog(@"You tapped @ this :%d",gestureRecognizer.view.tag); 
    //Regonize the gestures 
} 

Ci può essere qualche codice non necessario dal momento che, non v'è alcun frammento di codice con il tuo question.I ha dato una prova & mostrato un trucco se questo potrebbe funzionare per voi & risolvere il problema. ;)

+1

No Non sto provando alcun trucco. Accedo al pubblico 'panGestureRecognizers' e li configuro per utilizzare un numero diverso di tocchi richiesti. Questo è tutto. Il mio problema è ancora che il riconoscitore di gesti da un 'UITableView' ignora la sua proprietà' maximumNumberOfTouches'. – PeyloW

0

Provare this link e prestare attenzione a come risolvono le viste nidificate.

Ricordate le migliori pratiche per la Gestione degli eventi Multitouch:

Quando la gestione degli eventi, entrambi gli eventi di tocco e eventi di movimento, ci sono alcune tecniche raccomandate e modelli da seguire.

  • Applicare sempre i metodi di annullamento degli eventi.

Nell'implementazione, è necessario ripristinare lo stato della vista a ciò che era prima della sequenza multitouch corrente, liberando eventuali risorse transitori impostate per gestire l'evento. Se non si implementa il metodo di cancellazione, la vista potrebbe essere lasciata in uno stato incoerente. In alcuni casi, un'altra visualizzazione potrebbe ricevere il messaggio di annullamento.

  • Se si gestisce gli eventi in una sottoclasse di UIView, UIViewController, o (in rari casi) UIResponder,

    • è necessario implementare tutti i metodi di gestione degli eventi (anche se si tratta di un implementazione nulla).

    • Non chiamare l'implementazione della superclasse dei metodi.

  • Se si gestisce gli eventi in una sottoclasse di qualsiasi altra classe UIKit risponditore,

    • Non è necessario implementare tutti i metodi di gestione degli eventi.

    • Ma nei metodi implementati, assicurarsi di chiamare l'implementazione della superclasse.Ad esempio,

[super touchesBegan: theTouches withEvent: theevent];

  • Non eventi inoltrare ad altri oggetti responder del quadro UIKit.

I soccorritori che si inoltra gli eventi al dovrebbero essere le istanze delle vostre sottoclassi di UIView, e tutti questi oggetti devono essere consapevoli del fatto che eventi di inoltro è in atto e che, nel caso di eventi touch, essi possono ricevere tocchi che non sono legati a loro.

  • visualizzazioni personalizzate che si ridisegnano in risposta ad eventi dovrebbero solo gruppo di disegni stato nei metodi di gestione degli eventi ed eseguire tutti del disegno nel drawRect: metodo.

  • Non inviare esplicitamente eventi al risponditore (tramite nextResponder); invece, invoca l'implementazione della superclasse e lascia che UIKit gestisca l'attraversamento della catena di risposta.

Problemi correlati