停止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
……像瘟疫一样,为任何复杂的事情写出自定义的手势识别器。
我希望这能帮助别人像我一样把头发拉出来!