将触摸结束事件发送到 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];
-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