8

如果我在第一次触摸时抬起手指,那么它会很好地识别下一次触摸。只有当我连续按住第一次触摸然后尝试用不同的手指同时触摸不同的区域时。然后它将错误地将第二次触摸注册为来自第一次触摸。

更新它与 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
}
4

7 回答 7

10

我今天遇到了这个,(或者更确切地说,我今天把这个问题抛给了我!)。

我看到发生的事情:

  • 带手指的触摸屏 1
  • 接触开始起火
  • 带手指的触摸屏 2
  • 接触开始起火
  • 松开手指 2
  • 什么都没发生
  • 松开手指 1
  • 触及已结束的火灾
  • 触及已结束的火灾

正如 Gavin Clifton 所说,只有添加手势识别器才会发生这种情况。如果没有添加识别器,每个手指松开后都会触发 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 不再排队了!

于 2012-07-13T10:01:36.433 回答
7

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

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

有什么额外的想法吗?有没有人将 UIWindow 子类化以尝试以这种方式拦截触摸?感谢您提供的任何输入。

于 2010-05-04T02:35:35.340 回答
6

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

于 2011-10-09T22:54:56.363 回答
4

我知道这个问题有点老了,但我想我会与任何偶然发现这个线程并寻找答案的人分享我的经验,就像我刚刚遇到的那样。

我已经为这个问题苦苦挣扎了几个小时,我能想出的唯一解决方案是删除我正在使用的所有UIGestureRecognizer对象。

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

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

于 2012-06-21T19:34:49.880 回答
0

设置multipleTouchEnabled

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

于 2010-04-28T02:57:02.017 回答
0

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

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

于 2015-07-24T23:59:55.990 回答
0

我找到了另一个选择。

之后touchesBeganCGPoint没有动根据touchesMovedtouchesCancelled叫。

但是,如果CGPoint更改为touchesMoved,则touchesEnded调用。

于 2018-02-12T06:12:07.563 回答