窃取触摸的手势,如 iOS 多任务滑动

Posted

技术标签:

【中文标题】窃取触摸的手势,如 iOS 多任务滑动【英文标题】:Gestures that steal touches like iOS multitasking swipe 【发布时间】:2012-03-16 18:52:59 【问题描述】:

我知道我想做什么,但我不知道该怎么做:我想实现像 ios 多任务手势这样的东西。也就是说,如果触摸次数大于(例如)两次,我想从视图层次结构中的 any 视图中“窃取”触摸。当然,手势并不是用来控制多任务处理的,它只是我所追求的透明触摸窃取。

由于这是一个相当复杂的应用程序(它广泛使用 viewController 的容器),我希望它对它发生的视图是透明的(即,我希望能够显示任意视图和层次结构,包括 UIScrollViews、 MKMapViews、UIWebViews 等,而无需更改它们的实现以与我的手势配合使用)。

仅仅向公共父视图添加一个gestureRecognizer是行不通的,因为启用交互的子视图会吃掉所有落在它们上面的触摸。

添加一个视觉透明的支持 UI 的视图作为主视图层次结构的同级(但在前面)也不起作用,因为现在 这个 视图会吃掉所有的触摸。我已经尝试在 touchView 中重新实现 touchesBegan: 等,但是将触摸转发到 nextResponder 不起作用,因为那将是常见的超级视图,实际上是将触摸集中在应该的视图周围当 touchView 放弃它们时接收它们。

我确信我不是唯一一个为此寻找解决方案的人,而且我确信还有比我更聪明的人已经解决了这个问题。我什至怀疑它实际上可能并不难,只是今天我的大脑可能不会只见树木不见森林。无论如何,我都感谢任何有用的答案:)

【问题讨论】:

最后,我选择了不同的解决方案,因为我最初想法的 UX 似乎也不是最佳的。我现在有更小的“处理”区域,使用(和代码)不那么模棱两可。但如果有人对这个问题有明确的答案,我仍然有兴趣听到它。 【参考方案1】:

我建议你尝试使用方法调配,在 UIView 上重新实现 touchesbegan。我认为最好的方法是将触摸次数存储在静态共享变量中(以便每个视图都可以增加/减少这个值)。这只是一个非常简单的想法,持保留态度。

希望这会有所帮助。

Ciao! :)

【讨论】:

我避开了这个,因为它看起来很脏。最后,我选择了不同的解决方案,因为我最初想法的 UX 似乎也不是最佳的。我现在有更小的“处理”区域,使用(和代码)不那么模棱两可【参考方案2】:

一种可能但有潜在危险(如果您不小心的话)的方法是子类化您的应用程序 UIWindow 并重新定义 sendEvent: 方法。 由于应用程序接收到的每个触摸事件都会调用此方法,因此您可以检查它,然后决定调用[super sendEvent:](如果触摸未过滤),或者不调用它(如果触摸被过滤)或只是如果您仍在识别触摸,请推迟它的调用。

另一种可能性是使用hitTest:withEvent: 方法,但这需要将您的窃取视图正确放置在子视图中,并且我认为当您有许多视图控制器时它不适合。我相信以前的解决方案更通用。

【讨论】:

我避开了这个,因为它看起来很脏。最后,我选择了不同的解决方案,因为我最初想法的 UX 似乎也不是最佳的。我现在有更小的“处理”区域,使用(和代码)不那么模棱两可【参考方案3】:

实际上,在通用superview上添加手势识别器是正确的做法。但听起来您可能需要设置 delaysTouchesBegancancelsTouchesInView(或两者)以确保手势识别器在将其传递给子视图之前处理所有内容。

【讨论】:

我试过了,但是缩放 ScrollViews 仍然会偷东西。

以上是关于窃取触摸的手势,如 iOS 多任务滑动的主要内容,如果未能解决你的问题,请参考以下文章

怎么设置滑动返回键

启用多任务手势的 iPad 上的 UIScrollView 问题(iOS 4.3)

滑动删除 UITableView (iOS) 中的整个部分

android P/Q/R/S 9/10/11/12多任务手势动画OverviewInputConsumer情况-第二节

[MAUI]模仿iOS多任务切换卡片滑动的交互实现

iOS 上的全系统手势识别