将特定的触摸事件传播到下面的视图



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

视图A和视图B都是同一个父UIView的子视图。视图A和视图B是兄弟视图。视图A的帧大小与父视图相同。视图B只有视图A的一半大小,它在视图A之上。我想捕获视图B上的滑动事件/手势,但仍然传播其他事件/手势(例如,点击)从视图B到视图A。所以用户仍然可以与视图A交互(例如,点击视图A上的按钮),而视图B只捕获滑动手势。

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

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

,但似乎是全有或全无的方法。因为我无法在这些方法中检测到事件是点击还是滑动。我没有找到任何API可以程序化地触发一个点击在一个UIView(不调用触摸相关的方法)。

你应该将你的后兄弟视图移动到前视图的子视图,因为这有效地看起来相同,但使UIResponder链行为正确。然后,UIGestureRecognizer可以为您完成其余的工作。具体来说,它有一个属性,CancelsTocuhesInViews你可以关闭它,所以它不会吃触摸事件它有一个带功能的委托,允许你指定UIGestureRegonizer应该在什么条件下触发。实现你想让你的逻辑工作的UIGestureRecognizerDelegate方法。例如,如果你想要叠加视图处理一个点击,只有当一堆其他手势识别器不首先处理点击,然后你实现gestureRecognizer(_:shouldRequireFailureOf:),并让它返回true为每一个其他手势识别器你想要先去;你的手势识别器只有在所有其他手势识别器都无法处理点击时才会触发。

如果我理解正确的话,你想做的通常是使用UIGestureRecognizer对象和它的子类。你可以让一个手势识别器(即滑动(或平移?)手势识别器)依赖于另一个手势识别器(点击)。

你可以告诉一个手势识别器只有在另一个无法检测到它的手势时才触发。我还没必要这么做,所以不能给你更多细节,但我会研究那些类,看看是否有办法把它们链接起来,让它处理滑动,而只是不处理轻击。如果你不处理点击,它应该会自动转到任何能处理它的子视图

最新更新