停止UITableView消费触摸事件,以便父视图中的滑动菜单可以检测到水平滑动

为了达到这么简单的目标,我被迫绝望了。

我有一个菜单的视图,使用touchEvents滑动从左侧滑动手势时,通过一个水平滑动。 我不使用手势识别器,我只是使用touchesBegan,touchesMoved等。并跟踪起始触摸位置,中间触摸位置和最终触摸位置之间的x坐标差。 它工作很好。

但是,当我有一个UITableView的身体,触摸事件不再findpipe理菜单的视图的层次结构。 我尝试通过触摸superview / nextResponder,哪些作品,但我看到touchesBegan和2 touchesMoved调用之前,它只是停止进一步处理层次结构。

具体来说,我有一个SlideMenuView,其中有一个菜单视图和一个正文视图。 在身体视图内部,我有一些UITableView。 我看到(通过NSLog)触摸*方法从头到尾调用就好了。 我将它们传递给nextResponder,并开始在SlideMenuView中看到它们 – 但是在2次调用touchesMoved之后,它们似乎停止在SlideMenuView中,但是继续在我的UITableView中。

我重写了UITableView来做到这一点,但我没有改变更多的内部。

我知道这一定是可能的,因为它是在Facebook应用程序。 你可以在身体的任何地方滑动,水平滚动,并显示菜单。 我希望在这里自然发生同样的事情,但似乎有些奇怪的事情发生,而UITableView正在消耗或摧毁事件。

有人能帮我解决吗? 有人必须以干净的方式达到这个目的。

好的,对于任何感兴趣的人 – 我find了一个干净的解决scheme。

苹果知道他们在做什么。 早在我们用来覆盖touchesBegan那一天,…然后他们引入了GestureRecognizers 。 对于一些控件,如UIScrollView (和任何子类,如UITableView ),他们似乎屠杀他们的事件响应系统。 我认为Gesture Recognizers没有做任何特别的事情,只是简单地接触这些touchesBegan ,…方法 – 这是不正确的。

最安全的方法是使用Gesture Recognizers 。 具体来说,他们有一些select,可以使所有的差异。 如.cancelsTouchesInView = YES在我的情况。

所以我所做的是在菜单视图上使用PanGestureRecognizer ,将.cancelsTouchesInView设置为YES ,并且工作正常。 我要避免touchesBegan ……像瘟疫一样,为任何复杂的事情写出自定义的手势识别器。

我希望这能帮助别人像我一样把头发拉出来!