2012-07-31 75 views
2

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

达到此目的的最佳方法是什么? 我想我可以在超级视图中覆盖touchesMoved:withEvent:,做一次命中测试然后调用子视图,但有没有更好的解决方案? (我试图在超级检视中辞退急救员,但这并没有帮助)

+0

您是否设法找到解决方案?我遇到类似的问题,触摸被触发,并在屏幕上添加新的“UIView”。我需要在新的'UIView'中捕获'touchesMoved'事件,而不会从屏幕上释放手指......提前致谢! – 2012-08-30 11:56:33

+0

我将在本周末晚些时候处理这​​个完全相同的问题。如果我找出解决方案,我会在这里发布。 – 2015-03-20 21:32:49

回答

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:方法的重载。

Erik