touchesEnded不被称为?或随机被称为

touchesEnded不被称为?或随机被称为

问题描述:

如果我从第一次触摸中抬起手指,那么它会识别下一次触摸就好。只有当我持续第一次触摸,然后尝试用不同的手指同时触摸不同的区域时。然后它会错误地将第二次触摸注册为第一次触摸。touchesEnded不被称为?或随机被称为

更新它是与不被称为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 
} 
+1

我创建了一个简单的测试项目,似乎touchesEnded在每次解除任何手指时都会被调用... – Vladimir 2010-04-29 08:11:01

+0

Vladimir,你会介意在某处发布代码示例,以便我可以看到有什么不同吗?无论出于何种原因,我所有的touchesEnded都会在同一时间被调用,而不是实际发生的时间。 – iwasrobbed 2010-04-29 11:33:54

+0

顺便说一句,在我的程序中,触及UIImageViews的滚动视图内的所有内容都在UIView如果这有什么区别 – iwasrobbed 2010-04-29 15:55:44

无论出于何种原因,只有当触摸位于滚动视图内时,touchesEnded才会被延迟。如果你a)禁用滚动的滚动视图;或b)不使用滚动视图,然后touchesEnded立即交付。

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

还有其他想法吗?有没有人有过UIWindow的子类,试图拦截这种方式?您可以提供的任何输入值得赞赏。

设置multipleTouchEnabled

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

+0

tewha,你可能会在这里的正确轨道...我在代码中创建UIImageViews并在设置过程中设置MultipleTouchEnabled。出于某种原因,我不确定它的设置是否正确。我已经在其他地方看过,如果MultipleTouchEnabled没有设置为YES,那么touchesEnded将不会被调用,直到最后一次触摸结束(这完全匹配我的错误!)。 – iwasrobbed 2010-04-30 03:03:15

+0

没关系,只是检查,所有已启用,并确保足够的可用性multipleTouchEnabled为YES是:( 它可能与所有的UIImageViews在滚动视图内有什么关系吗?在滚动视图之外他们做得很好,但在滚动视图内不会立即发送消息。 – iwasrobbed 2010-04-30 03:28:27

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

我知道这个问题有点老,但我想我会分享我的经验,任何人在这个线程中绊倒寻找答案,就像我刚才一样。

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

对于我的设置,我使用平移和敲击识别器来捕捉这些手势,并使用touchesBegan和touchesEnded进行任何标准触摸事件。直到我移除UIGestureRecognizer对象时,touchesEnded方法才开始再次调用第二次触摸结束。具体来说,这是导致问题的泛认识者。

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

今天我有这个,(或者更确切地说,我今天把这个问题抛在了我身上!)。

我看到发生的事情:

  • 触摸屏,手指1起
  • 的touchesBegan火灾
  • 触摸屏,手指2起
  • 的touchesBegan火灾
  • 松开手指2
  • 什么也没有发生
  • 松开手指1
  • touchesEnded火灾
  • touchesEnded火灾

由于加文·克利夫顿说,如果你添加一个手势识别时才会发生。如果没有添加识别器,每次释放手指后touchesEnded都会触发。 如果我不需要使用识别器,那将会很棒...... !!!

我解决了这个通过添加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]; 

现在的姿势工作,的touchesBegan不再排队!

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

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

我找到了另一个选项。

经过touchesBeganCGPoint未移动根据touchesMoved,touchesCancelled调用。

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