将触摸结束事件发送到UIControl子类

时间:2017-03-24 08:43:21

标签: ios objective-c uicontrol

我有一个扩展UIControl并覆盖touchesBegan:withEvent:touchesEnded:withEvent:方法的类。

从另一个类开始,我希望在我的子类的实例上调用touchesEnded:withEvent:

此:

[myControl sendActionsForControlEvents:UIControlEventTouchUpInside];

不会导致两种方法中的任何一种被调用。

1 个答案:

答案 0 :(得分:0)

  1. 如果你想合成/生成一个UITouch事件(没有手指触摸屏幕),然后将它作为-touchesEnded:withEvent:的参数发送到你的UIControl子类,那么你就不能。

    Apple不允许我们生成这些内容,只允许iOS在响应程序链中生成和分发UITouch事件。如果你谷歌“合成UITouch”,有一些无证的方法可以做到这一点,但苹果对这些非常敌视并拒绝使用它们的应用程序。

  2. 您发布的代码

    [myControl sendActionsForControlEvents:UIControlEventTouchUpInside];

    仅导致触发与相应控件事件(TouchUpInside)关联的操作。它对touchesBegan / Moved / Ended没有影响。如果您已将操作-handleTap和目标viewController分配给您的控件,则发送-sendActionsForControlEvents;只会导致发送以下消息

    [viewController handleTap];

  3. 如果你想拦截和重定向一个实际的触摸事件(由于某种原因iOS不会发送到你的UIControl子类),那么从Reponder Chain中的任何一个对象做起来最简单 - 可见UIView(和子类)层次结构和“活动”视图控制器,应用程序委托和UIApplication对象。只需覆盖他们自己的-touchesBegan / Moved / Ended方法并将调用嵌套在里面,但我确定你已经考虑过了

  4. -touchesEnded:NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [myControl touchesEnded:touches withEvent:event]; }

    1. 由于你想在你自己的类上调用方法,而不是覆盖-touchesBegan/Moved/Ended,你不能只为UIControl子类添加一些自定义方法,不需要UITouch&amp; UIEvent参数并简单地调用它。例如
    2. -(void)touchAt:(CGPoint)location { //react to touch }

      并从您的其他课程中调用

      [myControl touchAt:CGPointMake(2.5, 2.5)];