如何从一个UIView的“转会”第一响应者到另一个?(How to “transfer” first

2019-07-17 22:11发布

我有一个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];
}

我认为根本UITouch对象(这是跨越触摸事件一致)没有被重定目标在CustomView点。 我怎样才能达到预期的效果?

Answer 1:

只需使用则hitTest:withEvent:方法找出查看“应该”接收事件,再往前就事件向相应的视图。 您可能必须做在家里跳舞,他们去的按钮之前拦截事件的一点点,但是这是则hitTest:withEvent:方法是为制作。



Answer 2:

你必须重写canBecomeFirstResponder返回YES,否则becomeFirstResponder什么都不做。 这是已经做了UIControl S,但不是UIView小号



文章来源: How to “transfer” first responder from one UIView to another?