我知道自己想做什么,但我对如何做到这一点感到难过:我想实现像iOS多任务手势一样的东西。也就是说,如果触摸次数大于两次,我想从视图层次结构中的任何视图中“偷”触摸。当然,手势并不是为了控制多任务处理,而是我所追求的透明触控。
由于这是一个相当复杂的应用程序(广泛使用viewController包含),我希望它对它碰巧发生的视图是透明的(即我希望能够显示任意视图和层次结构,包括UIScrollViews, MKMapViews,UIWebViews等,无需改变他们的实现就可以很好地使用我的手势了。)
只是将一个gestureRecognizer添加到公共超级视图不起作用,因为启用了交互的子视图会吃掉落在它们上的所有触摸。
将视觉上透明的启用UI的视图添加为主视图层次结构的同级(但在前面)也不起作用,因为现在此视图会占用所有触摸。我已尝试在touchView中重新实现touchesBegan:
等,但将触摸转发到nextResponder
不起作用,因为这将是常见的超级视图,实际上是在视图周围汇集触摸当touchView放弃它们时应该接收它们。
我相信我并不是唯一一个为此寻找解决方案的人,而且我确信有比这更聪明的人已经找到了解决方案。我甚至怀疑它可能实际上并不是很难,也许我的大脑今天也看不到树林。无论如何,我很感谢任何有用的答案:)
答案 0 :(得分:1)
我建议你尝试使用方法调配,重新实现UIView上的touchesbegan。我认为最好的方法是在静态共享变量中存储触摸次数(这样每个视图都可以增加/减少这个值)。这只是一个非常简单的想法,带着一点点盐。
希望这有帮助。
侨! :)
答案 1 :(得分:1)
可能但有潜在危险(如果您不小心)方法是将您的应用程序UIWindow子类化并重新定义sendEvent:
方法。
由于应用程序收到的每个触摸事件都会调用此方法,您可以检查它,然后决定调用[super sendEvent:]
(如果未过滤触摸),或者不调用它(如果触摸被过滤)或者只是在你仍然认出触摸时推迟通话。
另一种可能性是使用hitTest:withEvent:
方法,但这需要将您的窃取视图正确放置在子视图中,并且我认为当您有许多视图控制器时它不适合。我相信以前的解决方案更为通用。
答案 2 :(得分:0)
实际上,在公共超级视图上添加手势识别器是正确的方法。但听起来您可能需要设置delaysTouchesBegan
或cancelsTouchesInView
(或两者)以确保手势识别器在让它通过子视图之前处理所有内容。