2012-10-04 5 views
6

Jestem o krok od rozpaczy, próbując osiągnąć coś tak prostego.Stop UITableUżywaj zdarzeń dotykowych, dzięki czemu przesuwne menu w widoku rodzica może wykrywać poziome przeciągnięcia.

Mam widok z menu, które za pomocą touchEvents ślizga się od lewej strony, gdy ma to zrobić z poziomym przesunięciem. Nie korzystam z funkcji rozpoznawania gestów, używam tylko touchbegan, touchSoved itp. I śledzę różnicę współrzędnych x pomiędzy początkową pozycją dotyku, pozycją pośrednią i końcową pozycją dotyku. Działa świetnie.

Ale gdy w ciele mam UITableView, zdarzenia dotyku nie znajdują się już w hierarchii do widoku zarządzającego menu. Próbowałem omijać to, przekazując dotknięcia do superview/nextResponder, jakiego rodzaju prac, ale widzę połączenia touchesBegan i 2 touchesMoved, zanim przestaną być po prostu dalej przetwarzane w hierarchii.

W szczególności mam SlideMenuView, w którym znajduje się widok menu i widok treści. Wewnątrz widoku ciała mam w pewnym momencie UITableView. Widzę (przez NSLog), że metody dotknięć * są wywoływane od początku do końca po prostu dobrze. Przekazuję je do nextResponder i zaczynam je widzieć również w SlideMenuView - ale po 2 wywołaniach TouchMoved wydaje się, że zatrzymują się w SlideMenuView, ale kontynuują w moim UITableView.

Nadpisuję UITableView, aby to zrobić, ale nie zmieniłem nic więcej w nim.

Wiem, że to musi być możliwe, ponieważ jest w aplikacji Facebook. Możesz przesuwać w dowolne miejsce w ciele, które można przewijać, poziomo i odsłonić menu. Chcę, aby to samo naturalnie występowało tutaj, ale wygląda na to, że dzieje się coś dziwnego, a UITableView pochłania lub niszczy zdarzenia.

Czy ktoś może mi w tym pomóc? Ktoś musiał to osiągnąć w czysty sposób.

+0

Czy istnieje powód, dla którego nie można korzystać z funkcji rozpoznawania gestów? Myślę, że byłoby to łatwiejsze do osiągnięcia, gdybyś mógł to zrobić. – rdelmar

Odpowiedz

9

OK, dla każdego zainteresowanego - znalazłem czyste rozwiązanie.

Apple wie, co robią. Wracaliśmy w dniu, w którym zastąpiliśmy touchesBegan, ... ale potem wprowadzono GestureRecognizers. W przypadku niektórych formantów, takich jak UIScrollView (i wszelkie podklasy, takie jak UITableView), wydaje się, że rzeźnią swój system reagowania na zdarzenia. Popełniłem błąd, zakładając, że Gesture Recognizers nie robi nic specjalnego, i po prostu podłączam się do tych touchesBegan, ... metod - to nie jest poprawne.

Najbezpieczniejszym sposobem jest użycie Gesture Recognizers. W szczególności istnieje kilka opcji, które mogą mieć znaczenie. Takich jak .cancelsTouchesInView = YES w moim przypadku.

Więc to, co zrobiłem, to użyj PanGestureRecognizer w widoku menu, ustaw .cancelsTouchesInView na YES, i to działa. Uniknę touchesBegan, ... podobnie jak zarazy, i piszę niestandardowe rozpoznawanie gestów dla wszystkiego, co złożone.

Mam nadzieję, że pomoże to komuś wyciągnąć włosy jak ja!

Powiązane problemy