【问题标题】:touchesEnded not being called??? or randomly being calledtouchesEnded 没有被调用???或随机被调用
【发布时间】:2010-04-28 02:51:38
【问题描述】:

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

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

【问题讨论】:

  • 我创建了一个简单的测试项目,似乎每次抬起手指时都会调用 touchesEnded...
  • Vladimir,您介意在某处发布您的代码示例,以便我看看有什么不同吗?无论出于何种原因,我的所有 touchesEnded 都会在稍后同时被调用,而不是在它们实际发生时调用
  • 顺便说一句,在我的程序中,触摸是在滚动视图内的 UIImageViews 上,如果这有什么不同的话,所有这些都在 UIView 内
  • 弗拉基米尔,这可能与滚动视图中的所有 UIImageViews 有关吗?在滚动视图之外,它们做得很好并立即发送 touchesEnded 消息,但在滚动视图中,它们不会立即发送消息。这会以某种方式延迟还是没有正确发送到响应者链上?

标签: iphone multi-touch uitouch touchesbegan


【解决方案1】:

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

我看到发生的事情:

  • 1 指触摸屏
  • touchesBegan 火灾
  • 2指触摸屏
  • touchesBegan 火灾
  • 松开手指 2
  • 什么都没发生
  • 松开手指 1
  • touchesEnded 火灾
  • touchesEnded 火灾

正如 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 不再排队!

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

          【解决方案5】:

          设置multipleTouchEnabled

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

          【讨论】:

          • tewha,您可能在这里走上了正确的轨道...我正在代码中创建 UIImageViews 并在该设置期间设置 MultipleTouchEnabled。出于某种原因,我不确定它是否设置正确。我在别处读到,如果 MultipleTouchEnabled 未设置为 YES,则在最后一次触摸结束之前不会调用 touchesEnded(这完全符合我的错误!)。
          • 没关系,刚刚检查了所有都已启用,并且确定 multipleTouchEnabled 对所有都是 YES :( 这可能与滚动视图中的所有 UIImageViews 有关吗?在滚动视图之外它们做得很好,但是在滚动视图中,他们不会立即发送消息。
          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

            我找到了另一个选择。

            touchesBeganCGPoint之后没有移动,根据touchesMovedtouchesCancelled调用。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-11-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多