touchesEnded未被召唤???或随机调用

时间:2010-04-28 02:51:38

标签: iphone multi-touch uitouch touchesbegan

如果我在第一次触摸时抬起手指,那么它会识别下一次触摸就好了。只有当我持续第一次触摸然后尝试用不同的手指同时触摸另一个区域时。然后它会错误地将第二次触摸注册为再次从第一次触摸开始。

更新它与touchesEnded有关,直到最后一次触摸结束才被调用(它不关心你是否已经有5个其他触摸结束,然后你终于放弃了最后一次触摸一个......一旦最后一次触摸结束,它就会将它们全部结束)

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

 UITouch* touch = [touches anyObject];

 NSString* filename = [listOfStuff objectAtIndex:[touch view].tag];

// do something with the filename now

}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

 ITouch* touch = [touches anyObject];
 NSString* buttonPressed = [listOfStuff objectAtIndex:[touch view].tag];

 // do something with this info now
}

7 个答案:

答案 0 :(得分:9)

我今天有这个,(或者说我今天把这个问题抛弃了!)。

我看到了什么:

  • 使用手指1触摸屏
  • touchesBegan fires
  • 用手指触摸屏2
  • touchesBegan fires
  • 释放手指2
  • 没有任何反应
  • 释放手指1
  • touchesEnded fires
  • touchesEnded fires

正如Gavin Clifton所说,只有添加手势识别器才会发生这种情况。如果没有添加识别器,touchchesEnded会在每个手指释放后触发。 如果我不需要使用识别器,哪个会很棒...... !!!

我通过将 gestureRotation.delaysTouchesEnded = FALSE; 添加到我的识别器创建/添加代码来解决这个问题:

gestureRotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(gestureRotation_Callback:)];

[gestureRotation setDelegate:self];
gestureRotation.cancelsTouchesInView = FALSE;
gestureRotation.delaysTouchesEnded = FALSE;        // <---- this line!!
[self.view addGestureRecognizer: gestureRotation];
[gestureRotation release];

现在手势正常,触摸开始不再排队!

答案 1 :(得分:7)

无论出于何种原因,仅当触摸位于滚动视图内时,touchesEnded才会被延迟。如果你要么a)禁止滚动滚动视图;或者b)不使用滚动视图,然后立即传递touchesEnded。

我听说有些人拦截了sendEvent,但这对我来说似乎很粗略,我真的不想搞砸响应者链,因为sendEvent处理了大量的事件。

还有其他想法吗?有没有人曾经将UIWindow子类化,试图拦截那种方式?您可以提供的任何输入都表示赞赏。

答案 2 :(得分:6)

scrollview的属性delaysContentTouches默认设置为YES。它将延迟所有触摸事件,直到它确定滚动手势。

答案 3 :(得分:4)

我知道这个问题有点陈旧,但我想我会分享我的经验,因为任何偶然发现这个问题的人都会找到答案,就像我一样。

我一直在努力解决这个问题几个小时,我唯一能解决的问题就是删除我正在使用的任何 UIGestureRecognizer 对象。

对于我的设置,我使用平移和点按识别器捕获这些手势,并使用touchesBegan和touchesEnded进行任何标准触摸事件。直到我删除了UIGestureRecognizer对象,才触发touchesEnded方法再次调用第二次触摸结束。特别是它是导致问题的泛识别器。

我不完全确定这是否适用于这种情况,但它解决了我遇到的问题。

答案 4 :(得分:0)

设置multipleTouchEnabled

在Interface Builder中,它是“启用用户交互”下的“多次触摸”复选框。

答案 5 :(得分:0)

我遇到了这个问题,在ScrollView中的按钮上永远不会调用touchesEnded。根据Ovidiu的回答,我发现手动设置ScrollView的ContentOffset导致了问题。据推测,contentOffset设置方式让我感到困惑的是ScrollView是否试图按下按钮或滚动视图。

让偏移量保持在0,0会使问题消失。

答案 6 :(得分:0)

我找到了另一种选择。

根据touchesBegan移动CGPointtouchesMoved后,touchesCancelled被调用。

但是,如果根据CGPoint更改touchesMoved,则会调用touchesEnded