如何停止touchesEnded:withEvent:从subView到ViewController的propogate?

时间:2017-02-15 09:26:30

标签: ios uitouch hittest

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

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

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

touchesEnded中,apple doc说“如果你在不调用super(常用模式)的情况下重写此方法,你还必须覆盖其他方法来处理触摸事件,如果只是作为存根(空)实现“。

另一种方法是什么?

2 个答案:

答案 0 :(得分:1)

你很亲密!

要防止将触摸事件传递给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 {

}

答案 1 :(得分:0)

而不是实现子视图的touchesDidEnd为什么不在superview touchesDidEnd这样的事情中完成整个工作

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

通过这种方式,您可以了解触摸是否最初来自子视图或超级视图。

备用:你可以在superview和subview中实现这两种方法,但是像上面的代码一样,你可以在superview中返回调用,如果它与之交互的视图是子视图,并保持使用子视图中的触摸代码

如果你想要一个不同的意见,请告诉我们你在尝试什么,以便我们能够给出相应的答案