使用手势识别器的命中测试确认视图不会收到事件的情况?



'我有一个UIImageView作为子视图的视图。主视图上有一个手势识别器,99%的情况下工作。

每隔一段时间,手势识别器似乎失败,事件被推到堆栈上的下一个响应器。我在那个顶视图的hitTest方法中添加了一个断点,并且hit test方法在所有情况下都正确地返回最内部的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>)>>
)

u是命中测试(UIImageView)的结果。u.superview是带有手势识别器的容器视图。在这里,我确认u.superview有一个手势识别器。那么,它不应该接收那个事件吗?在什么情况下,这个事件不会进入singleTap,而是弹出到下一个响应者?

编辑:我已经成功地捕获了这个问题(XCode崩溃了,上次我有它几分钟后…),现在我发现触摸甚至使它一直进入HotspotView。touchesBegan正确地获得触摸,即使它随后无法调用手势识别器。我已经记录了成功和不成功点击的触摸和触摸事件(就它们是否调用GR而言),它们看起来是相同的。

所以,现在我更迷路了。

1)为命中测试返回正确的对象
2)右对象接收touchesBegan调用
3)对象有它的手势识别器
4)然而,有时,手势识别器不被调用(不可靠,很难复制)。

我的猜测是,在手势识别器不识别的情况下,手势不是一个合格的点击。例如,如果你不小心连续点击两次,或者按住太长时间,或者稍微滑动手指,手势识别器可能不会认为这个手势是一次点击。

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

顺便说一下,你在做一件很奇怪的事。HotspotView和UIImageView的大小完全相同。所以它的唯一目的似乎就是检测水龙头。但你可以只用UIImageView来做。为什么不保持简单呢?设置UIImageView的userInteractionEnabled,并将点击手势识别器附加到UIImageView本身。

相关内容

最新更新