在UIView外拖动时触发touchesEnded

时间:2012-10-23 09:31:41

标签: ios ios5 ios6

我有一个UIView子类,我使用touchesBegan,touchesMoved,touchesEnded处理触摸。 我注意到,当我开始触摸内部然后向外拖动UIView touchesEnded没有被触发时,有没有办法让我在UIView框架外拖动时调用它? 感谢

3 个答案:

答案 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,这将保留此视图所分配的触摸对象并实现以下逻辑:

  1. 当您收到touchesBegan时 - 为触摸坐标匹配的给定UIView的数组添加触摸对象(您可能需要迭代所有子视图并将坐标与框架匹配以找到正确的坐标)< / LI>
  2. 当您收到touchesMoved时 - 从UIView's阵列移除之前位置的触摸,并将其添加到UIView以获取当前位置(如果有)
  3. 当您收到touchesEnded&amp; touchesCancelled - 删除所有UIViews数组
  4. 中的触摸

    当您从自定义UIView数组中删除或添加触摸对象时,您可以调用您的委托方法(实现观察者模式),因为此时您知道它是否真的是按下或未按下的事件。请记住,您可能在一个数组中有许多触摸对象,因此在调用您的委托之前,请检查您是否添加了第一个对象或删除了最后一个对象,因为这是您应该调用您的委托的唯一情况。

    我在上一场比赛中实施了这样的解决方案,但我没有UIViews虚拟按钮。