3

我有一个 UIView 子类(CustomView出于这个问题的目的),它自己处理所有touches事件(开始、移动、结束、取消)。我也有一个与它重叠UIButton的兄弟。CustomView

例如,我的视图层次结构如下所示:

  • UIView(控制器的视图)
    • 带框架的自定义视图(0、0、300、300)
    • 带框架的 UIButton (0, 0, 100, 50)

一旦用户拖出 UIButton,我希望 CustomView 捕获触摸事件。通过调试日志,似乎该UIControlEventTouchDragExit事件是要拦截的事件(尽管直到触摸距离按钮大约 100 像素时它才会触发,但这对于这个问题并不重要)。

理想情况下,当拖动退出事件被触发时,按钮将停止接收触摸移动事件,CustomView 将收到一个touchesBegan事件(即使我需要以某种方式自己伪造一个),并且所有未来的触摸事件(touchesMoved等)都将发送到自定义视图。

我尝试了以下方法,但没有任何效果:

-(void)btnTouchDragExit:(id)sender
{
    UIButton * btn = sender;
    [btn resignFirstResponder];
    [customView becomeFirstResponder];
}

我认为底层UITouch对象(在触摸事件中是一致的)没有被重新定位为指向 CustomView。我怎样才能达到预期的效果?

4

2 回答 2

5

只需使用 hitTest:withEvent: 来确定哪个视图“应该”接收事件,然后将事件转发到适当的视图。在事件转到按钮之前,您可能需要做一些跳舞来拦截事件,但这就是 hitTest:withEvent: 的用途。

于 2009-09-13T19:58:58.770 回答
1

你必须重写canBecomeFirstResponder以返回 YES 否则becomeFirstResponder什么都不做。这已经在UIControls 上完成,但不是在UIViews上

于 2009-09-14T03:27:13.057 回答