如何停止 touchesEnded:withEvent:从 subView 传播到 ViewController?

how to stop touchesEnded: withEvent: propogate from subView to ViewController?

我有一个视图被添加为 viewController 的子视图。 这个子视图和viewController都实现了这个方法

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

我发现当我点击子视图时,这两个方法都会被调用。 我只想调用子视图的 touchesEnded 。如何很好地实现这一目标? (不要在其中添加手势)

touchesEnded 中,Apple 文档这样说 "If you override this method without calling super (a common use pattern), you must also override the other methods for handling touch events, if only as stub (empty) implementations."

其他方法是什么?

与其实现子视图的 touchesDidEnd 为什么不在父视图的 touchesDidEnd 中完成整个工作,像这样

if([touch anyObject].view == subview){
   return;
}

这样你就可以知道触摸最初是来自子视图还是父视图。

Alternative : 你可以在父视图和子视图中实现这两个方法,但是像上面的代码你可以 return 在父视图中调用,如果视图它与之交互的是子视图,并继续在子视图中的触摸代码中工作

如果您想要不同的意见,请告诉我们您的尝试,以便我们给出相应的答案

你很接近!

为了防止将触摸事件传递给 superview,您应该重写触摸事件的所有方法。将所有触摸事件方法添加到您的子视图中,然后您应该就可以了。

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

}

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

}

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

}

- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

}