传播特定的触摸事件到底部视图

3

我想要实现一个类似以下的功能:

视图A和视图B都是同一父级UIView的子视图。视图A和视图B是兄弟视图。视图A的尺寸与父视图相同。视图B只有一半的大小,并且位于视图A上面。我希望在视图B上捕获滑动事件/手势,但仍然将其他事件/手势(例如点击)从视图B传递到视图A。因此,用户可以在视图B仅捕获滑动手势时仍然与视图A进行交互(例如在视图A上点击按钮)。

我已经尝试在视图B上实现以下方法:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

但似乎这是一种全有或全无的方法。因为我不能在这些方法中检测到事件是轻触还是滑动。而且我也没有找到任何可以以编程方式触发UIView上轻触的API(不调用与触摸相关的方法)。


检测不同类型的手势非常困难。为什么不使用手势识别器呢? - clemens
@macmoonshine 我尝试了手势识别器,但好像不起作用。视图B和视图A是兄弟视图。我不知道如何将来自视图B的手势事件传递给视图A,因为视图B在视图A的上面。 - codingrhythm
1
您可以将识别器添加到一个公共的父视图中。 - clemens
2个回答

3
你应该将后置视图移动到前置视图的子视图中,因为这样看起来效果相同,但可以使UIResponder链的行为正确。然后,UIGestureRecognizer可以为你完成其余工作。具体而言,它有一个属性CancelsTocuhesInViews,你可以关闭它,以便它不会吞噬触摸事件,并且它有一个委托和方法,可以让你指定UIGestureRegonizer应该在什么条件下触发。实现你想要的UIGestureRecognizerDelegate方法来使你的逻辑工作。例如,如果你希望叠加视图仅在一堆其他gestureRecognizers没有处理tap时才处理tap,则实现gestureRecognizer(_:shouldRequireFailureOf:)并将其返回true,以便每个其他手势识别器都可以先执行;只有当所有这些其他手势识别器都无法处理tap时,你的手势识别器才会触发。

1
如果我理解正确,你想做的通常使用UIGestureRecognizer对象及其子类来完成。您可以创建一个手势识别器(例如滑动(或是平移)手势识别器),使其依赖于另一个手势识别器(用于轻拍)。您可以告诉一个手势识别器仅在另一个手势未能检测到其手势时触发。我还没有必要这样做,所以无法给您更多细节,但我会研究这些类并查看是否有一种方法将它们链接起来,以处理滑动,而只是不处理轻拍。如果您不处理轻拍,它应该自动转到任何子视图,以便其处理。

感谢您的建议。这里的问题是View A和View B是同一父视图的子视图,它们是兄弟视图。我尝试了UIGestureRecognizer方法。我可以处理View B上的滑动手势。但是,由于View B始终位于View A的顶部并阻止所有用户交互,所以我该如何将在View B上发生的轻击手势传递给View A呢? - codingrhythm
你能改变视图的顺序吗?另外,不确定这是否会破坏你的层次结构的清晰性,但你能在父视图上安装手势识别器,然后反过来做吗?如果检测到平移手势,请将其传递给视图,否则告诉视图从其hitTest(_:withEvent:)方法返回NO。 - uliwitness

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