touchesMoved
在 iOS 中,即使在超级视图中开始触摸时,我也希望在子视图中接收事件!理想情况下,我还希望touchesBegan
在移动手指到达子视图时收到。
实现这一目标的最佳方法是什么?我想我可以在超级视图中覆盖touchesMoved:withEvent:
,进行命中测试,然后调用子视图,但是有更好的解决方案吗?(我曾尝试在 superview 中辞去第一响应者的职务,但这没有帮助)
touchesMoved
在 iOS 中,即使在超级视图中开始触摸时,我也希望在子视图中接收事件!理想情况下,我还希望touchesBegan
在移动手指到达子视图时收到。
实现这一目标的最佳方法是什么?我想我可以在超级视图中覆盖touchesMoved:withEvent:
,进行命中测试,然后调用子视图,但是有更好的解决方案吗?(我曾尝试在 superview 中辞去第一响应者的职务,但这没有帮助)
我今天必须解决这个完全相同的问题,而我刚刚做到了。
比如说,您有以下内容——这正是我的案例的抽象描述:
解决方案是覆盖-hitTest:withEvent:
方法。该方法的目的是返回应该处理触摸的视图。
您有两个选择:在子视图中覆盖它或在主视图中覆盖它。如果您希望所有触摸都由子视图处理,您可以让-hitTest:withEvent
子视图返回self
并完成它。在我的情况下,我仍然需要主视图上的按钮有自己的触摸检测,所以我的解决方法是覆盖-hitTest:withEvent:
主视图上的方法,如下所示:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if (CGRectContainsPoint(self.myButton.frame, point))
{
return self.myButton;
}
else
{
return self.mySubView;
}
}
这就像一个绝对的魅力!希望这也适用于你:-)
你当然应该修改里面的细节-hitTest:withEvent:
以满足你的特定需求——也许你想把这个覆盖限制在一个特定的区域或一组特定的控件——但关键是这个线程上主要问题的答案在于对此的覆盖-hitTest:withEvent:
方法的覆盖。
埃里克