【发布时间】:2011-05-12 18:35:41
【问题描述】:
在示例项目aurioTouch 应用程序委托中,代码表明(我在其他地方读过)传递给 touchesBegan、touchesMoved 和 touchesEnded 的触摸事件对象将是同一个对象,而它仍然是一组用户动作,例如触摸和移动手指。当我重写 UIScrollView 并实现这些方法时,我得到的事件是不同的对象。我在这里错过了什么?
【问题讨论】:
在示例项目aurioTouch 应用程序委托中,代码表明(我在其他地方读过)传递给 touchesBegan、touchesMoved 和 touchesEnded 的触摸事件对象将是同一个对象,而它仍然是一组用户动作,例如触摸和移动手指。当我重写 UIScrollView 并实现这些方法时,我得到的事件是不同的对象。我在这里错过了什么?
【问题讨论】:
UITouch 对象将相同,但它们被打包在一个新事件中。
【讨论】:
你是对的,UIEvent 在为一个手势传递触摸事件时被重用。来自docs:
代表触摸的 UIEvent 对象 事件在整个 多点触控序列; UIKit 重用 每个事件的相同 UIEvent 实例 交付给应用程序。你 永远不应保留事件对象或 从事件返回的任何对象 目的。如果你需要保留 从周围的事件信息 一个阶段到另一个阶段,你应该复制 来自 UITouch 的信息或 UIEvent 对象。
我认为您的案例的行为差异是由UIScrollView 完成的特殊事件处理造成的。滚动视图延迟事件传递,因为它们需要检测用户的滚动意图(滑动手势)。所以他们必须有一种方法来保存 UIEvents——可能会复制它们以确保它们保持原始状态。这可能是您看到不同对象的原因。
请注意,以上所有内容都只是猜测。
【讨论】:
touchs和event.allTouches在touchesBegan函数中有什么区别?
allTouches 返回所有当前存在的触摸,而传递的参数仅包含与此事件相关的触摸。