UIGestureRecognizer接收触摸事件,但也将其转发给UIControl。

38
如何使一个UIView上的UIGestureRecognizer能够接收到触摸事件,同时确保另一个底层/覆盖的UIView也接收到相同的触摸事件? 假设我有以下视图层次结构: 视图A(蓝色)和B(红色)都是同一父视图(灰色)的子视图。换句话说,它们都是兄弟姐妹,它们的顺序决定了哪个覆盖另一个。 选项1:视图B(红色)具有常规UIButton作为其子视图。选项2:视图A(蓝色)具有常规UIButton作为其子视图。 出于说明的目的,给出选项1: 视图A(蓝色)附加了UITapGestureRecognizer(或者甚至更多其他UIGestureRecognizer)。最优雅的方法是什么,以确保UIButton在其区域内接收所有触摸,但视图A(蓝色)也接收其UITapGestureRecognizer上的这些触摸?
如果可能的话,解决方案不应涉及扩展 UIButton 类并手动转发来自按钮本身的任何事件。想象一下视图B将包含更多控件,而不仅仅是一个按钮。所有这些控件都应该以某种方式允许视图A接收其 UIGestureRecognizer 上的触摸。
到目前为止,我提供了两个选项,因为我不在乎哪个视图(A或B)首先出现,只要两者都能接收到触摸即可。
迄今为止,我的所有方法都突然陷入僵局。也许自定义响应者链会是一个不错的解决方案?我一直在考虑整个 UIKit / UIEvent / UIResponder 堆栈中是否存在优雅的解决方案。

4
+1 对于这样一个精心设计的问题 :) - Nick Weaver
1个回答

21

你尝试过使用这个了吗?

cancelsTouchesInView 一个布尔值,影响当识别到手势时是否向视图传递触摸。

@property(nonatomic) BOOL cancelsTouchesInView

我确实尝试过使用选项1和2,并且使用该属性并没有任何不同; 在这两种情况下,只有按钮或视图中的按钮区域收到触摸。 - Till
哎呀,当我尝试让cancelsTouchesInView生效时,我实际上尝试了不同的选项。我的按钮是视图A和B的兄弟节点,因此该属性无效。当按照我所描述的选项1操作时,该属性完全按照所述方式工作。任何触摸该按钮都会触发按钮touch-up-inside事件以及在该按钮的父视图上识别触摸手势。这并没有真正解决我的整个问题(即也将触摸识别到那个其他视图上),但它让我更接近目标 - 因此我点赞了 - 感谢。 - Till
示例代码,在我的情况下,'-(IBAction)handleHoldOnPlay:(UIGestureRecognizer*)sender { 'sender.cancelsTouchesInView = NO;...'(谢谢Sergio) - tmr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接