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

Posted

技术标签:

【中文标题】将触摸结束事件发送到 UIControl 子类【英文标题】:Send touch ended event to UIControl subclass 【发布时间】:2017-03-24 08:43:20 【问题描述】:

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

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

这个:

[myControl sendActionsForControlEvents:UIControlEventTouchUpInside];

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

【问题讨论】:

你重写的时候有没有调用 super 方法? 不,你不调用这些方法的超级。 糟糕。我将它与自定义手势识别器混淆了。 【参考方案1】:

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

    Apple 不允许我们生成这些,只有 ios 被允许沿着响应者链生成和分发 UITouch 事件。如果您在 Google 上搜索“合成 UITouch”,有一些未记录的方法可以做到这一点,但 Apple 对这些方法非常敌对并拒绝使用它们的应用程序。

    您发布的代码

    [myControl sendActionsForControlEvents:UIControlEventTouchUpInside];

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

    [viewController handleTap];

    1234563 UIView(和子类)层次结构和“活动”视图控制器、应用程序委托和 UIApplication 对象。只需覆盖他们自己的 -touchesBegan/Moved/Ended 方法并将调用嵌套在里面,但我相信你已经考虑过了

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

    既然你想在你自己的类上调用方法,而不是覆盖-touchesBegan/Moved/Ended,你就不能在不需要UITouch & UIEvent 参数的UIControl 子类中添加一些自定义方法并简单地调用它。例如

-(void)touchAt:(CGPoint)location //react to touch

并从你的其他班级调用它

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

【讨论】:

以上是关于将触摸结束事件发送到 UIControl 子类的主要内容,如果未能解决你的问题,请参考以下文章

被覆盖的 UIControl 或 UIView 如何知道在其上方结束的触摸事件?

:多点触摸与手势检测

将触摸事件从覆盖 UIView 转发到 UIWebView / 如何从代码将触摸事件发送到 uiwebview

将触摸事件从视图发送到控制器

UIControl 如何将所有触摸事件传递给响应者链中的下一个对象?

如何在 Swift 中将触摸事件发送到 nextResponder