我有一个没有子视图的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: {()}
答案 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)
我不确定为什么,但这里有一些关于这个问题的进一步见解:
UIResponder
方法才被调用。例如,touchesBegan:withEvent:直到结束才会被调用。我最好的猜测是,在某些情况下,来自hitTest
的返回值可能会在调用之间发生变化。但我想不出为什么会发生这种情况。如果不是这样,则多次调用它是没有意义的。
另一个想法是代码编写效率低下。这似乎不太可能,但基于这些信息,这是一种可能性。