我有一个扩展UIControl
并覆盖touchesBegan:withEvent:
和touchesEnded:withEvent:
方法的类。
从另一个类开始,我希望在我的子类的实例上调用touchesEnded:withEvent:
。
此:
[myControl sendActionsForControlEvents:UIControlEventTouchUpInside];
不会导致两种方法中的任何一种被调用。
答案 0 :(得分:0)
如果你想合成/生成一个UITouch事件(没有手指触摸屏幕),然后将它作为-touchesEnded:withEvent:
的参数发送到你的UIControl子类,那么你就不能。
Apple不允许我们生成这些内容,只允许iOS在响应程序链中生成和分发UITouch事件。如果你谷歌“合成UITouch”,有一些无证的方法可以做到这一点,但苹果对这些非常敌视并拒绝使用它们的应用程序。
您发布的代码
[myControl sendActionsForControlEvents:UIControlEventTouchUpInside];
仅导致触发与相应控件事件(TouchUpInside)关联的操作。它对touchesBegan / Moved / Ended没有影响。如果您已将操作-handleTap
和目标viewController
分配给您的控件,则发送-sendActionsForControlEvents;
只会导致发送以下消息
[viewController handleTap];
如果你想拦截和重定向一个实际的触摸事件(由于某种原因iOS不会发送到你的UIControl子类),那么从Reponder Chain中的任何一个对象做起来最简单 - 可见UIView(和子类)层次结构和“活动”视图控制器,应用程序委托和UIApplication对象。只需覆盖他们自己的-touchesBegan / Moved / Ended方法并将调用嵌套在里面,但我确定你已经考虑过了
-touchesEnded:NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[myControl touchesEnded:touches withEvent:event];
}
-touchesBegan/Moved/Ended
,你不能只为UIControl子类添加一些自定义方法,不需要UITouch&amp; UIEvent参数并简单地调用它。例如 -(void)touchAt:(CGPoint)location {
//react to touch
}
并从您的其他课程中调用
[myControl touchAt:CGPointMake(2.5, 2.5)];