窃取触摸的手势,如 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上添加手势识别器是正确的做法。但听起来您可能需要设置 delaysTouchesBegan
或 cancelsTouchesInView
(或两者)以确保手势识别器在将其传递给子视图之前处理所有内容。
【讨论】:
我试过了,但是缩放 ScrollViews 仍然会偷东西。以上是关于窃取触摸的手势,如 iOS 多任务滑动的主要内容,如果未能解决你的问题,请参考以下文章
启用多任务手势的 iPad 上的 UIScrollView 问题(iOS 4.3)
android P/Q/R/S 9/10/11/12多任务手势动画OverviewInputConsumer情况-第二节