如何将第一响应者从一个UIView“转移”到另一个UIView?

时间:2009-09-13 19:56:04

标签: iphone uiview uibutton uitouch first-responder

我有一个UIView子类(CustomView用于此问题),它有自己处理所有touches个事件(开始,移动,结束,取消)。我还有一个UIButton,它是CustomView的兄弟,与之重叠。

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

  • UIView(控制者的观点)
    • 带框架(0,0,300,300)的CustomView
    • UIButton with frame(0,0,100,50)

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

理想情况下,当触发拖动退出事件时,按钮将停止接收触摸移动事件,CustomView将获得touchesBegan事件(即使我需要以某种方式假装自己),以及所有未来的触摸事件(touchesMoved等)将被发送到CustomView。

我尝试了以下内容,但没有任何效果:

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

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

2 个答案:

答案 0 :(得分:5)

只需使用hitTest:withEvent:找出“应该”接收事件的视图,然后将事件转发到适当的视图。在进入按钮之前,你可能需要做一些跳舞来拦截事件,但这就是hitTest:withEvent:是为了制作。

答案 1 :(得分:1)

你必须覆盖canBecomeFirstResponder才能返回YES,否则becomeFirstResponder什么都不做。这已在UIControl上完成,但不在UIView s