Iphone 如何";“转让”;从一个UIView到另一个UIView的第一响应者?
我有一个UIView子类(Iphone 如何";“转让”;从一个UIView到另一个UIView的第一响应者?,iphone,uiview,uibutton,uitouch,first-responder,Iphone,Uiview,Uibutton,Uitouch,First Responder,我有一个UIView子类(CustomView,用于此问题),它自己处理所有的触摸事件(开始、移动、结束、取消)。我还有一个ui按钮,它是与之重叠的CustomView的兄弟 例如,我的视图层次结构如下所示: UIView(控制器视图) 带边框的自定义视图(0,0,300,300) 带边框的UIButton(0,0,100,50) 我希望CustomView能够在用户拖出UIButton后捕获触摸事件。通过调试日志记录,似乎UIControlEventTouchDragExit事件是要拦
CustomView
,用于此问题),它自己处理所有的触摸
事件(开始、移动、结束、取消)。我还有一个ui按钮
,它是与之重叠的CustomView
的兄弟
例如,我的视图层次结构如下所示:
- UIView(控制器视图)
- 带边框的自定义视图(0,0,300,300)
- 带边框的UIButton(0,0,100,50)
UIControlEventTouchDragExit
事件是要拦截的事件(尽管直到触摸距离按钮约100像素时才会触发,但这对该问题并不重要)
理想情况下,当触发拖动退出事件时,按钮将停止接收触摸移动事件,CustomView将获得一个触摸开始
事件(即使我自己需要伪造一个),并且所有未来的触摸事件(触摸移动
等)将发送到CustomView
我尝试了以下方法,但没有任何效果:
-(void)btnTouchDragExit:(id)sender
{
UIButton * btn = sender;
[btn resignFirstResponder];
[customView becomeFirstResponder];
}
我认为底层的
UITouch
对象(在触摸事件中是一致的)没有被重定目标指向CustomView。如何才能达到预期效果?只需使用hitTest:withEvent:来确定哪个视图“应该”接收事件,然后将事件转发到相应的视图。在事件转到按钮之前,您可能需要做一点跳跃来拦截事件,但这就是hitTest:withEvent:的目的。您必须覆盖canBecomeFirstResponder
以返回YES,否则becomeFirstResponder
什么都不做。这已经在UIControl
s上完成了,但在UIView
s上没有,通过对UIButton进行子类化并覆盖touchsmoved,我已经能够做到这一点(遍历superview树调用hitTest,直到它找到一个具有触摸点的树)。。但是,我必须手动(从该点开始)将触摸事件转发到该视图。难道没有系统调用以便Cocoa/UIWindow/UIApplication将触摸发送到新视图吗?在Win32中,它的ReleaseCapture/SetCapture(newWnd)…在superview上调用hitTest:withEvent:,它将告诉您它的哪个子视图将是事件的第一响应者。一旦你明白了这一点,只需调用touch(开始|移动|结束):withEvent:
就可以了,但这正是我试图避免的,因为这需要子类化,通过这样做,我只能在自定义按钮上有这种行为(而不是圆角Rect或任何其他按钮)。我还看到将触摸事件转发到UIScrollViews和UIWebViews之类的东西时会发生一些奇怪的事情,因此这可能不是一个完全通用的解决方案。我将把这个问题留一段时间,看看是否还有其他建议。将它添加到我的UIView子类中没有帮助。仍然需要对UIButton进行子类化并强制重定向触摸事件。从概念的角度来看,似乎为了实现这一点,我不会调用[customView becomeFirstResponder]
,但应该调用类似[UIApplication assignFirstResponder:customView]
或其他静态/全局函数。