Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何";“转让”;从一个UIView到另一个UIView的第一响应者?_Iphone_Uiview_Uibutton_Uitouch_First Responder - Fatal编程技术网

Iphone 如何";“转让”;从一个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事件是要拦

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

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

  • UIView(控制器视图)
    • 带边框的自定义视图(0,0,300,300)
    • 带边框的UIButton(0,0,100,50)
我希望CustomView能够在用户拖出UIButton后捕获触摸事件。通过调试日志记录,似乎
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]
或其他静态/全局函数。