7

我快要绝望了,试图实现如此简单的事情。

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

但是,当我在 body 中有一个 UITableView 时,触摸事件不再沿着层次结构向上到达管理菜单的视图。我试图通过将触摸传递给 superview/nextResponder 来解决这个问题,这种方法很有效,但我看到了一个 touchesBegan 和 2 个 touchesMoved 调用,然后它才停止在层次结构中进一步处理。

具体来说,我有一个 SlideMenuView,其中有一个菜单视图和一个正文视图。在正文视图中,我在某些时候有 UITableView。我看到(通过 NSLog)touches* 方法从头到尾都被调用得很好。我将它们传递给 nextResponder 并开始在 SlideMenuView 中看到它们 - 但在两次调用 touchesMoved 之后,它们似乎在 SlideMenuView 中停止,但在我的 UITableView 中继续。

我正在重写 UITableView 来执行此操作,但我在其中没有进行任何更改。

我知道这一定是可能的,就像在 Facebook 应用程序中一样。您可以在身体的任何地方滑动,可以水平滚动并显示菜单。我希望同样的事情在这里自然发生,但看起来好像发生了一些奇怪的事情,并且 UITableView 正在消耗或破坏这些事件。

有人可以帮我解决这个问题吗?一定有人以干净的方式实现了这一点。

4

1 回答 1

9

好的,对于任何感兴趣的人 - 我找到了一个干净的解决方案。

苹果知道他们在做什么。回到我们过去常常覆盖的那一天touchesBegan,......但后来他们推出了GestureRecognizers。对于某些控件,例如UIScrollView(以及任何子类,例如UITableView),它们似乎会破坏它们的事件响应器系统。我假设Gesture Recognizers不做任何特别的事情,只是简单地使用这些touchesBegan, ... 方法,这是错误的——这是不正确的。

最安全的方法是使用Gesture Recognizers. 具体来说,它们上有一些选项可以使一切变得不同。比如.cancelsTouchesInView = YES我的情况。

所以我所做的是PanGestureRecognizer在菜单视图上使用 a ,设置.cancelsTouchesInViewYES,它可以工作。我要避免touchesBegan,......像瘟疫一样,并为任何复杂的东西编写自定义手势识别器。

我希望这可以帮助有人像我一样把头发拉出来!

于 2012-10-05T10:22:33.667 回答