Ios 是否可以决定UITouch绑定到哪个视图?

Ios 是否可以决定UITouch绑定到哪个视图?,ios,uitouch,uiresponder,uievent,Ios,Uitouch,Uiresponder,Uievent,我有几个UIView,它们有一些复杂的形状,我通过每个UIView的drawRect:方法绘制了这些形状。我已经保存了对路径的引用(通过CGPath属性),并且在我的touchs方法中使用该引用来检测触摸是否实际位于路径或形状(CGPathContainsPoint)内。由于形状的原因,视图中有一些区域是透明的(显然,如果视图的backgroundColor属性设置为clearColor或其他类似属性,则任何非方形/矩形的区域都有透明区域) 对于视图最终位于顶部或相互重叠的情况(经常发生),我正

我有几个UIView,它们有一些复杂的形状,我通过每个UIView的drawRect:方法绘制了这些形状。我已经保存了对路径的引用(通过CGPath属性),并且在我的touchs方法中使用该引用来检测触摸是否实际位于路径或形状(CGPathContainsPoint)内。由于形状的原因,视图中有一些区域是透明的(显然,如果视图的backgroundColor属性设置为clearColor或其他类似属性,则任何非方形/矩形的区域都有透明区域)

对于视图最终位于顶部或相互重叠的情况(经常发生),我正在测试触摸方法(touchesbreated等),以查看触摸是否实际位于CGPath或形状内。如果触摸不在形状内,我会将触摸转发到下面的下一个视图,以查看它是否依次通过该要求

但遗憾的是(让我非常沮丧的是),这与实际绑定到视图的触摸行为并不相同。除了一个特别的问题外,我在各个方面都在研究这个问题。每个视图都使用UIRotationGestureRecognitor。但是,如果触摸源自另一个视图的透明区域,并且该视图将该触摸转发到其下方的视图,则不会触发UIGestureRecognitor

我已经从我知道的每个角度看了这个问题。我试着想一些方法,将触摸重新分配或绑定到适当的视图,但我不知道这是否可行。只要视图只是将触摸转发到另一个视图,触摸将保持绑定到首先接收触摸的原始视图

我想知道您是否可以通过将UIApplication或UIWindow子类化并重写sendEvent来实现这一点:“方法。我不确定苹果会在这方面给你什么样的控制。我不能做任何可能访问私有API的事情。我真的需要一些方法来重新分配触摸,以便视图认为触摸属于它


有什么想法吗?

您可以通过子类化UIView或子类化UIGestureRecognizer来实现这一点

子类化UIView 通过子类化UIView(或其任何子类)并重写

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
您可以决定哪些点在您的视图中。对于路径以外的点,只需返回
NO

子类化图形识别器 通过将UIgestureRecognitor(或其任何子类)子类化并重写

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
您可以决定手势识别器应该识别哪些触摸。对于路径之外的所有接触,您应该调用(但不是子类)

靠你自己


指向路径内部? 在这两种情况下,您都需要知道这些点是否位于您所说存储的路径内

如果路径已存储为
UIBezierPath
s,则只需调用

- (BOOL)containsPoint:(CGPoint)point
在贝塞尔路径上。可能需要通过调用将点或触摸转换为与路径相同的视图坐标

- (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view

在你看来

如果路径存储为CGPath,则可以使用

[UIBezierPath bezierPathWithCGPath:CGPath]; 

虽然这并没有完全回答这个问题,但它让我走上了正确的道路。在进一步研究之后,我发现这篇博客帖子完全回答了这个问题:我接受了这个答案,因为这是一个很好的尝试,帮助我找到了我需要知道的。有什么我可以澄清的吗?因为每个视图都是通过覆盖触摸方法来“拦截”触摸的(触摸开始、移动等),-(BOOL)内部点:(CGPoint)带有事件的点:(UIEvent*)除非我在视图外部进行触摸,否则不会调用事件。但是通过遵循我上面提供的链接,我能够覆盖底层子视图的hitTest:方法,然后使用pointInside:确定它是否是有效的触摸。另外,我相信您对“路径内部的点”的理解是正确的部分,这是无关的,因为我说我已经这样做了。不过再次感谢