2012-10-04 15 views
6

Sono quasi portato alla disperazione cercando di ottenere qualcosa di così semplice.Interrompi UITableView che consuma gli eventi di tocco in modo che il menu scorrevole nella visualizzazione padre possa rilevare i movimenti orizzontali

Ho una vista con un menu che, utilizzando touchEvents scorre da sinistra quando viene gestita per farlo con uno scorrimento orizzontale. Non utilizzo i riconoscitori di gesti, uso semplicemente i tocchi. Began, touchMoved, ecc. E traccia la differenza di coordinate x tra la posizione di tocco iniziale, quelle intermedie e la posizione di tocco finale. Funziona alla grande.

Tuttavia, quando nel corpo ho un UITableView, gli eventi di tocco non si trovano più nella gerarchia fino alla vista che gestisce il menu. Ho cercato di aggirare questo passando tocchi a superview/nextResponder, che tipo di opere, ma vedo un tocco Began e 2 tocca Chiamate trasferite prima che semplicemente smetta di essere elaborate più in alto nella gerarchia.

In particolare, ho uno SlideMenuView, in cui è presente una vista menu e una vista corpo. All'interno della vista del corpo, ho a un certo punto l'UITableView. Vedo (tramite NSLog) che i metodi touches * vengono chiamati dall'inizio alla fine bene. Li passo a nextResponder e inizio a vederli anche in SlideMenuView - ma dopo 2 chiamate a touchMoved, sembrano fermarsi in SlideMenuView ma continuano nel mio UITableView.

Sto eseguendo l'override di UITableView per eseguire questa operazione, ma non ho apportato modifiche ad altro.

So che questo deve essere possibile, come è nell'app Facebook. Puoi scorrere in qualsiasi parte del corpo, che è scorrevole, orizzontale e rivela il menu. Voglio che la stessa cosa avvenga naturalmente qui, ma sembra che qualcosa di strano stia accadendo e UITableView sta consumando o distruggendo gli eventi.

Qualcuno può aiutarmi con questo? Qualcuno deve averlo raggiunto in modo pulito.

+0

C'è un motivo per cui non è possibile utilizzare i riconoscitori di gesti? Penso che sarebbe più facile da realizzare se potessi farlo. – rdelmar

risposta

9

Ok, per chiunque sia interessato, ho trovato una soluzione pulita.

Apple sa cosa stanno facendo. Nel giorno in cui eravamo abituati a ridefinire touchesBegan, ... ma poi hanno introdotto GestureRecognizers. Per alcuni controlli, come lo UIScrollView (e qualsiasi sottoclasse, come UITableView), sembrano macellare il loro sistema di risposta agli eventi. Ero in colpa per aver supposto che il Gesture Recognizers non facesse nulla di speciale, e semplicemente agganciassi a questi metodi touchesBegan, ... - questo non è corretto.

Il modo più sicuro è utilizzare Gesture Recognizers. In particolare, ci sono alcune opzioni su di loro che possono fare la differenza. Ad esempio .cancelsTouchesInView = YES nel mio caso.

Quindi quello che ho fatto, è utilizzare un PanGestureRecognizer nella visualizzazione Menu, impostare .cancelsTouchesInView su YES e funziona. Ho intenzione di evitare touchesBegan, ... come la piaga, e di scrivere riconoscitori di gesti personalizzati per qualcosa di complesso.

Spero che questo aiuti qualcuno a tirare fuori i capelli come ero!