代码之家  ›  专栏  ›  技术社区  ›  Jason

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

  •  3
  • Jason  · 技术社区  · 15 年前

    我有一个uiview子类( CustomView 在这个问题上)有自己的处理 touches 事件(开始、移动、结束、取消)。我也有一个 UIButton 那是…的兄弟姐妹 定制视图 它重叠了。

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

    • uiview(控制器视图)
      • 带框架的自定义视图(0、0、300、300)
      • 带框架的ui按钮(0、0、100、50)

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

    理想情况下,当触发DragExit事件时,按钮将停止接收触摸移动事件,CustomView将获得 touchesBegan 事件(即使我需要自己伪造一个),以及所有未来的触摸事件( touchesMoved 等)将发送到CustomView。

    我尝试过以下方法,但没有任何效果:

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

    我认为潜在的 UITouch 对象(在触摸事件之间是一致的)没有被重新定位为指向CustomView。我怎样才能达到预期的效果?

    2 回复  |  直到 15 年前
        1
  •  5
  •   Dave DeLong    15 年前

    只需使用hitTest:withEvent:来确定“应该”接收事件的视图,然后将事件转发到相应的视图。在事件进入按钮之前,您可能需要做一些舞蹈来拦截事件,但这就是HitTest:WithEvent:的目的。

        2
  •  1
  •   Ed Marty    15 年前

    你必须重写 canBecomeFirstResponder 否则返回“是” becomeFirstResponder 什么也不做。这已经在上完成了 UIControl S,但不是 UIView S

    推荐文章