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

Jas*_*son 3 iphone uibutton uiview uitouch first-responder

我有一个UIView子类(CustomView为了这个问题的目的),它有自己的所有touches事件处理(开始,移动,结束,取消).我也有一个重叠UIButton的兄弟姐妹CustomView.

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

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

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

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

我尝试了以下,它没有任何影响:

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

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

Dav*_*ong 5

只需使用hitTest:withEvent:来确定哪些视图"应该"接收事件,然后将事件转发到适当的视图.你可能不得不做一些跳舞来拦截事件,然后再去按钮,但这就是hitTest:withEvent:是为了制作的.