ios - 停止 UITableView 消耗触摸事件,以便父 View 中的滑动菜单可以检测到水平滑动

标签 ios uitableview cocoa-touch menu swipe

为了实现如此简单的目标,我快要绝望了。

我有一个带有菜单的 View ,使用 touchEvents 从左侧滑动,当它被打成水平滑动手势时。我不使用手势识别器,我只是使用 touchesBegan、touchesMoved 等。并跟踪起始触摸位置、中间触摸位置和结束触摸位置之间的 x 坐标差异。效果很好。

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

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

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

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

谁能帮我解决这个问题?一定有人以干净的方式实现了这一目标。

最佳答案

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

Apple 知道他们在做什么。回到过去,我们曾经重写 touchesBegan,...但随后他们引入了 GestureRecognizers。对于某些控件,例如 UIScrollView(以及任何子类,例如 UITableView),它们似乎破坏了它们的事件响应系统。我错误地假设 Gesture Recognizers 没有做任何特别的事情,只是挂接到这些 touchesBegan,...方法 - 这是不正确的。

最安全的方法是使用手势识别器。具体来说,它们有一些选项可以发挥重要作用。例如 .cancelsTouchesInView = YES 在我的例子中。

所以我所做的是在菜单 View 上使用 PanGestureRecognizer,将 .cancelsTouchesInView 设置为 YES,并且它起作用了。我将避免 touchesBegan,...就像瘟疫一样,并为任何复杂的事物编写自定义手势识别器。

我希望这能帮助像我一样拔头发的人!

关于ios - 停止 UITableView 消耗触摸事件,以便父 View 中的滑动菜单可以检测到水平滑动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12730747/

相关文章:

ios - UIModalViewController StatusBar背景颜色

ios - 当前单元格展开时折叠其他 UITableViewCell

iphone - 为什么我的表格 View 单元格在使用 reloadRowsAtIndexPaths 重新加载时消失?

iphone - UIButton 没有响应

objective-c - 并发访问 GCD 中的单个 FFTSetup 数据结构

objective-c - CALayer 不呈现内容

ios - WebView - 嵌入 HTML5(CSS 不工作)

ios - UITableView 在顶部插入行崩溃

ios - 将取消按钮放在底部的 UIActionSheet 中

ios - ios获取当前应用程序图标的方法