UIView hitTest:withEvent:调用三分

时间:2011-05-12 03:20:06

标签: objective-c cocoa-touch ios uiscrollview

我有一个没有子视图的UIScrollView。当我拖动滚动视图时,它的hitTest:withEvent:被调用三次,并且事件中从未触及任何触摸。为什么会这样(我看到了另一篇文章,但它似乎没有包含在内)?以下是滚动视图的hitTest...pointInside:withEvent:

的日志
2011-05-11 20:12:37.472 MyApp[10909:707] hit test for UIScrollView 119.500000,102.000000, timestamp: 357978 touches: {()}
2011-05-11 20:12:37.475 MyApp[10909:707] pointInside for UIScrollView 119.500000,102.000000,  timestamp: 357978 touches: {()} 
2011-05-11 20:12:37.477 MyApp[10909:707] hit test for UIScrollView 119.500000,102.000000, timestamp: 357978 touches: {()}
2011-05-11 20:12:37.479 MyApp[10909:707] pointInside for UIScrollView 119.500000,102.000000,  timestamp: 357978 touches: {()} 
2011-05-11 20:12:37.481 MyApp[10909:707] hit test for UIScrollView 119.500000,102.000000, timestamp: 358021 touches: {()}
2011-05-11 20:12:37.482 MyApp[10909:707] pointInside for UIScrollView 119.500000,102.000000,  timestamp: 358021 touches: {()} 
2011-05-11 20:12:37.484 MyApp[10909:707] pointInside for UIScrollView 119.500000,396.000000,  timestamp: 358021 touches: {()} 

3 个答案:

答案 0 :(得分:9)

hitTest:是一种实用程序方法,用于在特定点查找视图。 不会代表用户点击触摸屏。为响应同一事件,多次调用hitTest是完全合理的;所有方法应该做的是返回点下的视图,不应该触发任何副作用。

如果您想跟踪触摸事件,则应覆盖touchesBegan:和朋友。

答案 1 :(得分:3)

我遇到了同样的问题,并没有真正找到答案,但您可以使用以下两种解决方案中的一种:

1。 将命中测试存储在数组中并进行比较,以便在相同时返回,以防止它连续被调用3次。

2。 而不是hittest,使用touchesBegan,touchesCancelled,touchesEnded和touchesMoved,如下所示:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch * touch = [[event allTouches] anyObject];
    CGPoint touchLocation = [touch locationInView:touch.view];
    NSLog(@"%f - %f", touchLocation.x, touchLocation.y);
}

我使用了touchesBegan等解决方案,它就像一个魅力:)

答案 2 :(得分:1)

我不确定为什么,但这里有一些关于这个问题的进一步见解:

  • 它似乎并不特定于UIScrollView。我用UIView进行了测试 - 结果相同。
  • 无论视图层次结构或返回值如何,似乎都会在根视图上调用三次。
  • 传递给hitTest的事件对于前两个调用基本上是空白的(但该点始终有效);该事件具有有效的时间戳,但没有第三次呼叫的触摸信息。
  • 在所有三个hitTest调用完成后,看起来UIResponder方法才被调用。例如,touchesBegan:withEvent:直到结束才会被调用。
  • 所有三个调用都来自(闭源,我相信)函数UIApplicationHandleEvent中的不同点,基于堆栈跟踪。

我最好的猜测是,在某些情况下,来自hitTest的返回值可能会在调用之间发生变化。但我想不出为什么会发生这种情况。如果不是这样,则多次调用它是没有意义的。

另一个想法是代码编写效率低下。这似乎不太可能,但基于这些信息,这是一种可能性。