偷取iOS多任务滑动等触控的手势

时间:2012-03-16 18:53:00

标签: ios cocoa-touch uiview uigesturerecognizer

我知道自己想做什么,但我对如何做到这一点感到难过:我想实现像iOS多任务手势一样的东西。也就是说,如果触摸次数大于两次,我想从视图层次结构中的任何视图中“偷”触摸。当然,手势并不是为了控制多任务处理,而是我所追求的透明触控。

由于这是一个相当复杂的应用程序(广泛使用viewController包含),我希望它对它碰巧发生的视图是透明的(即我希望能够显示任意视图和层次结构,包括UIScrollViews, MKMapViews,UIWebViews等,无需改变他们的实现就可以很好地使用我的手势了。)

只是将一个gestureRecognizer添加到公共超级视图不起作用,因为启用了交互的子视图会吃掉落在它们上的所有触摸。

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

我相信我并不是唯一一个为此寻找解决方案的人,而且我确信有比这更聪明的人已经找到了解决方案。我甚至怀疑它可能实际上并不是很难,也许我的大脑今天也看不到树林。无论如何,我很感谢任何有用的答案:)

3 个答案:

答案 0 :(得分:1)

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

希望这有帮助。

侨! :)

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

实际上,在公共超级视图上添加手势识别器是正确的方法。但听起来您可能需要设置delaysTouchesBegancancelsTouchesInView(或两者)以确保手势识别器在让它通过子视图之前处理所有内容。