2012-10-04 4 views
6

Ich bin dabei, verzweifelt zu versuchen, etwas so Einfaches zu erreichen.Stop UITableView Touch-Ereignisse zu konsumieren, so dass das Verschieben von Menüs in der Eltern-Ansicht horizontale Wischbewegungen erkennen kann

Ich habe eine Ansicht mit einem Menü, dass mit TouchEvents von links, wenn es gestikuliert wird, mit einem horizontalen Streichen zu schieben. Ich benutze keine Gestenerkenner, ich benutze einfach die touchesBegan, touchesMoved, etc .. und verfolge den x-Koordinatenunterschied zwischen der Start-Touch-Position, den dazwischen liegenden und der letzten Touch-Position. Es funktioniert großartig.

Aber wenn ich im Körper habe ich eine UITableView, die Berührungsereignisse finden nicht mehr ihren Weg nach oben in der Hierarchie zu der Ansicht, die das Menü verwaltet. Ich habe versucht, dies zu umgehen, indem ich Berührungen an superview/nextResponder übergebe, welche Art von Arbeiten, aber ich sehe ein touchesBegan und 2 touchesMoved Aufrufe, bevor es einfach weiter oben in der Hierarchie verarbeitet wird.

Konkret habe ich eine SlideMenuView, in der es eine Menüansicht und eine Körperansicht gibt. In der Körperansicht habe ich irgendwann das UITableView. Ich sehe (über NSLog), dass die touchs * -Methoden von Anfang bis Ende ganz gut aufgerufen werden. Ich gebe sie an nextResponder weiter und beginne, sie auch in SlideMenuView zu sehen - aber nach 2 Aufrufen von touchesMoved scheinen sie in SlideMenuView aufzuhören, aber in meinem UITableView fortzufahren.

Ich überschreibe das UITableView, um dies zu tun, aber ich habe nichts mehr davon verändert.

Ich weiß, dass dies möglich sein muss, wie es in der Facebook-App ist. Sie können an einer beliebigen Stelle im scrollbaren Bereich horizontal wischen und das Menü anzeigen. Ich möchte, dass das Gleiche hier natürlich vorkommt, aber es scheint, als würde etwas Seltsames passieren, und das UITableView verbraucht oder zerstört die Ereignisse.

Kann mir jemand dabei helfen? Jemand muss das auf eine saubere Art und Weise erreicht haben.

+0

Gibt es einen Grund, warum Sie keine Gestenerkennung verwenden können? Ich denke, das wäre leichter zu erreichen, wenn Sie es könnten. – rdelmar

Antwort

9

Okay, für alle Interessierten - ich habe eine saubere Lösung gefunden.

Apple weiß, was sie tun. Damals haben wir touchesBegan überschrieben ... aber dann haben sie GestureRecognizers eingeführt. Für einige Steuerelemente, wie das UIScrollView (und alle Unterklassen wie UITableView) scheinen sie ihr Event-Responder-System zu schlachten. Ich war schuld für die Annahme, dass die Gesture Recognizers nichts besonderes tun, und einfach in diese touchesBegan, ... Methoden einhaken - das ist nicht korrekt.

Der sicherste Weg ist die Verwendung der Gesture Recognizers. Insbesondere gibt es einige Optionen, die den Unterschied ausmachen können. Wie .cancelsTouchesInView = YES in meinem Fall.

Also was ich getan habe, ist eine PanGestureRecognizer in der Menüansicht verwenden, setzen .cancelsTouchesInView auf YES, und es funktioniert. Ich werde vermeiden, touchesBegan, ... wie die Pest, und benutzerdefinierte Gestenerkennung für alles komplexe schreiben.

Ich hoffe, dass dies jemand hilft, ihre Haare ausziehen, wie ich war!