Iphone 使用手势识别器确认的点击测试视图获胜的情况';你没有收到这件事吗?

Iphone 使用手势识别器确认的点击测试视图获胜的情况';你没有收到这件事吗?,iphone,ios,event-handling,uigesturerecognizer,Iphone,Ios,Event Handling,Uigesturerecognizer,`我有一个UIImageView作为子视图的视图。主视图上有一个单键手势识别器,可以在99%的时间内工作 每隔一段时间,手势识别器似乎会失败,事件会被推上堆栈,交给下一个响应者。我在该俯视图的hitTest方法中添加了一个断点,在所有情况下,hitTest方法都会正确返回最内部的UIImageView,包括当事件发生错误时 在什么情况下,视图可能是命中测试的结果,但不能将事件传递给其手势识别器?当手势选择器未被调用时,我已从hitTest断点打印出此调试代码: (lldb) po u $2 =

`我有一个UIImageView作为子视图的视图。主视图上有一个单键手势识别器,可以在99%的时间内工作

每隔一段时间,手势识别器似乎会失败,事件会被推上堆栈,交给下一个响应者。我在该俯视图的hitTest方法中添加了一个断点,在所有情况下,hitTest方法都会正确返回最内部的UIImageView,包括当事件发生错误时

在什么情况下,视图可能是命中测试的结果,但不能将事件传递给其手势识别器?当手势选择器未被调用时,我已从hitTest断点打印出此调试代码:

(lldb) po u
$2 = 0x20854520 <UIImageView: 0x20854520; frame = (0 0; 61 62); opaque = NO; layer = <CALayer: 0x208e7670>>

(lldb) po [u superview]
$0 = 0x1fd225e0 <HotspotView: 0x1fd225e0; frame = (303 663; 61 62); gestureRecognizers = <NSArray: 0x2082b850>; layer = <CALayer: 0x1fd15af0>>

(lldb) po ((HotspotView *)u.superview).gestureRecognizers
$1 = 0x208bc940 <__NSArrayI 0x208bc940>(
    <UITapGestureRecognizer: 0x20828fa0; state = Possible; cancelsTouchesInView = NO; delaysTouchesEnded = NO; view = <HotspotView 0x1fd225e0>; target= <(action=handleSingleTap:, target=<HotspotView 0x1fd225e0>)>>
)
(lldb)pou
$2=0x20854520
(lldb)po[u superview]
$0=0x1fd225e0
(lldb)po((热点视图*)u.superview)。手势识别器
$1=0x208bc940(
)
u
是命中测试(UIImageView)的结果
u.superview
是附加了手势识别器的容器视图。因此,在这里,我确认
u.superview
有一个手势识别器那么,它不应该接收该事件吗?在什么情况下,此事件不会进入singleTap,而是冒泡到下一个响应者?

编辑:我成功地再次捕捉到了这个问题(上次我使用XCode时,它在几分钟后崩溃了…),现在我发现触摸甚至可以一直进入热点视图。touchesbearth即使无法调用手势识别器,也能正确获取触摸。我已经记录了成功和失败轻触的触摸和触摸事件(根据它们是否调用GR),它们看起来是相同的

所以,现在我更迷路了

1) 为命中测试返回正确的对象
2) 正确的对象接收其touchesbreated调用
3) 对象具有其手势识别器

4) 然而,有时,手势识别器没有被调用(没有可靠性,也很难复制)

我的猜测是,在手势识别器无法识别的情况下,手势不是合格的点击。例如,如果您不小心连续轻触两次,或按住时间过长,或手指稍微滑动,则手势识别器可能无法识别出该手势

换句话说,记住触摸不是一种手势。您正在做一些很好的日志记录,显示结构是什么,并且您已经显示最近的触摸是在UIImageView上,但这并不意味着手势识别器将其识别为点击。可能存在其他相互冲突的手势识别器,或者该手势可能看起来不像轻敲


顺便说一下,你在这里做了一件很奇怪的事。HotspotView与UIImageView的大小完全相同。因此,它的唯一目的似乎是检测水龙头。但您可以单独使用UIImageView来实现这一点。为什么不保持简单呢?设置UIImageView的
userInteractionEnabled
,并将点击手势识别器连接到UIImageView本身。

看起来一切正常。“冒泡到下一个响应者”是什么意思?如果你的目标是使图像视图可点击,为什么不在图像视图上附加一个手势识别器?你是否设置了图像视图的
userInteractionEnabled
?我猜是的,因为这是命中测试的结果。图像视图大小不一定与可命中区域大小匹配,因此它们是两个不同的对象。是的,userInteractionEnabled显然设置为yes,否则它将永远无法工作。在给定的热点上,一旦它决定失败,这种情况100%都会发生。99%的用户表示,99%的热点工作正常,但以前工作的热点偶尔会失败。如果我把它杀掉,然后(通过其他应用程序功能)再添加回来,下次它会再次正常工作。因此,这不是双击或拖动之类的情况。至于为什么它包含UIImageView,Hotspot的功能远不止是添加图像,这与这里无关。就像我说的,手势识别器很复杂。他们与其他手势识别器竞争,他们有代理,代理可以告诉他们失败,等等。UIImageView甚至可以告诉superview的手势识别器失败(其
手势识别器应该开始
)。很多事情都可能导致手势识别器失败。我想,你所描述的只是故事的一小部分。那么,我不讲故事的哪一部分呢?我不知道。你没有说出来。