我有一个UIView子类,我使用touchesBegan,touchesMoved,touchesEnded处理触摸。 我注意到,当我开始触摸内部然后向外拖动UIView touchesEnded没有被触发时,有没有办法让我在UIView框架外拖动时调用它? 感谢
答案 0 :(得分:1)
改为使用touchesCancelled。
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
}
答案 1 :(得分:1)
可能正在调用- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
请检查UIResponder Class Reference
<强> touchesCancelled:withEvent:方法强>
当系统事件(例如低内存)发送到接收器 警告)取消触摸事件。
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
参数的
<强>触摸强>
A set of UITouch instances that represent the touches for the ending phase of the event represented by event. event An object representing the event to which the touches belong.
<强>讨论强>
当Cocoa Touch框架收到a时,将调用此方法 系统中断需要取消触摸事件;对于 这个,它生成一个相位为的UITouch对象 UITouchPhaseCancel。中断可能会导致中断 应用程序不再处于活动状态或要从中删除的视图 窗口
当一个对象收到touchesCancelled:withEvent:消息时 应该清理在其中建立的任何国家信息 touchesBegan:withEvent:implementation。
此方法的默认实现不执行任何操作。然而 UIR应答器的UIKit子类,特别是UIView, 将消息转发到响应者链。要将邮件转发到 下一个响应者,将消息发送到super(超类 实现);不要将消息直接发送到下一个 响应者。例如,
[super touchesCancelled:touch withEvent:event];
如果在不调用super的情况下覆盖此方法(常用) pattern),你还必须覆盖其他处理触摸的方法 事件,如果仅作为存根(空)实现。可用性
Available in iOS 2.0 and later.
答案 2 :(得分:0)
即使您不在视图框架内,您仍应在touchesMoved
中获得viewController
。我会将数组添加到您的自定义UIView
,这将保留此视图所分配的触摸对象并实现以下逻辑:
touchesBegan
时 - 为触摸坐标匹配的给定UIView
的数组添加触摸对象(您可能需要迭代所有子视图并将坐标与框架匹配以找到正确的坐标)< / LI>
touchesMoved
时 - 从UIView's
阵列移除之前位置的触摸,并将其添加到UIView
以获取当前位置(如果有)touchesEnded
&amp; touchesCancelled
- 删除所有UIViews
数组当您从自定义UIView数组中删除或添加触摸对象时,您可以调用您的委托方法(实现观察者模式),因为此时您知道它是否真的是按下或未按下的事件。请记住,您可能在一个数组中有许多触摸对象,因此在调用您的委托之前,请检查您是否添加了第一个对象或删除了最后一个对象,因为这是您应该调用您的委托的唯一情况。
我在上一场比赛中实施了这样的解决方案,但我没有UIViews
虚拟按钮。