2

touchesMoved在 iOS 中,即使在超级视图中开始触摸时,我也希望在子视图中接收事件!理想情况下,我还希望touchesBegan在移动手指到达子视图时收到。

实现这一目标的最佳方法是什么?我想我可以在超级视图中覆盖touchesMoved:withEvent:,进行命中测试,然后调用子视图,但是有更好的解决方案吗?(我曾尝试在 superview 中辞去第一响应者的职务,但这没有帮助)

4

1 回答 1

0

我今天必须解决这个完全相同的问题,而我刚刚做到了。

比如说,您有以下内容——这正是我的案例的抽象描述:

  • 包含按钮和子视图的主视图
  • 当触摸在主视图上开始时,您希望在子视图上接收触摸事件
  • 一个例外是该按钮:如果您在主视图中点击该按钮,则该按钮应处理该按钮

解决方案是覆盖-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:方法的覆盖。

埃里克

于 2015-03-21T00:10:38.860 回答