【问题标题】:When touches Cancelled method get invoked in iPhone?什么时候在 iPhone 中调用 Canceled 方法?
【发布时间】:2011-04-21 04:50:15
【问题描述】:

我能够理解,当用户只是触摸视图时,触摸 Began 和 Ended 调用。当用户在视图上滑动手时,将调用 touches Moved 方法。但是什么时候会调用 touches Canceled 或通过用户的什么操作调用此方法?

【问题讨论】:

  • 当用户触摸视图并突然或不正确地删除该触摸时,将调用此方法。在这种情况下,将调用 touchesbegan 或 touchesMoved,但不会调用 touchesEnd,而是调用 touchesCancel

标签: iphone uitouch


【解决方案1】:

我认为可能调用 touchesCancelled 的最常见原因(从 iOS 3.2 开始)是在 UIGestureRecognizer 识别手势之后。如果您的视图附加了任何类型的手势识别器,那么提供 touchesCancelled 方法的自定义实现通常非常重要 - 请注意,这包括使用手势识别器的现成视图,包括 UIScrollView。

默认情况下,手势识别器会在识别时取消对命中测试视图的触摸传递,尽管可以禁用此行为。这涉及向该视图发送 touchesCancelled 消息,很可能是在 touchesBegan 或 touchesMoved 消息之后。如果您的触摸处理代码依赖于在 touchesEnded 方法中实现的代码,则它可能永远不会被触发,并且可能会发生某种严重的问题,因此需要在 touchesCancelled 中正确绑定任何松散的末端。

手势识别器功能的来龙去脉显然比我在这里提到的要复杂一些 - 我强烈建议阅读 Apple 的 Gesture Recognizers 文档。

另外,请查看手势识别器上的 WWDC videos(从 2010 年开始)。

【讨论】:

  • 您可以通过将每个UIGestureRecognizercancelsTouchesInView 设置为NO 来禁用此行为。
【解决方案2】:

注意:如果您在 touchesBegan 之后启动 UIView 动画,触摸也会被取消。为防止这种情况,请确保包含 UIViewAnimationOptionAllowUserInteraction:

例如

[UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^{
            self.aView.hidden = NO;
            self.aView.alpha = 1;
        } completion:nil];

【讨论】:

    【解决方案3】:

    来自Apple Reference 文档

    当系统发送给接收方 事件(例如内存不足警告) 取消触摸事件。

    讨论

    这个方法在 Cocoa 的时候被调用 Touch框架接收系统 需要取消的中断 触摸事件;为此,它 生成一个 UITouch 对象,其中包含 UITouchPhaseCancel 的阶段。这 中断是可能的 导致应用程序不再 活动或要从中删除的视图 窗户

    当一个对象收到一个 touchesCancelled:withEvent: 给它发消息 应该清理任何状态信息 这是建立在其 touchesBegan:withEvent: 实施。

    这个的默认实现 方法什么都不做。然而立即 UIResponder 的 UIKit 子类, 特别是UIView,转发 向响应者链发送消息。

    【讨论】:

      【解决方案4】:

      并且,来自Event Handling Guide for iOS,p。 19:

      当触摸序列被系统事件(例如来电)取消时,它会发送 touchesCancelled:withEvent: 消息。

      【讨论】:

        【解决方案5】:

        我在UIScrollView 下的视图上处理touchesBegan()/touchesMoved(),这很有挑战性。当我捏时,我的触摸一直在某个地方取消(单次触摸移动就可以了),我正在研究如何停止被取消。我发现,UIScrollView上有一个属性Can Cancel On Scroll,如果你的情况和我的情况类似,你可以勾选它以停止被取消。

        听起来你的触摸被取消的情况很多,所以我的回答只是其中之一。

        【讨论】:

          猜你喜欢
          • 2011-07-21
          • 1970-01-01
          • 2015-07-13
          • 2012-11-30
          • 2016-05-30
          • 1970-01-01
          • 1970-01-01
          • 2012-05-16
          相关资源
          最近更新 更多