忽略透明UIControl上的触摸 - 不由添加的操作函数处理

Ras*_*sto 6 cocoa-touch uiview hittest uicontrol ios

我有一个UIControl包含一些其他控件的自定义.在这些控件之间有空的空间和我UIControl需要透明的背景.

我需要捕捉我的自定义上发生的所有触摸事件,UIControl即使它们恰好发生在其他控件之间(透明区域).我不能使用手势识别器,我需要更多的控制然后他们提供.相反,我想注册触摸处理功能,如下所示:

myControl.addTarget(self, action: "handleTouchDown:event:", forControlEvents: UIControlEvents.TouchDown)
Run Code Online (Sandbox Code Playgroud)

有了这种方法,我会收到与非透明区域相关的触摸,myControl而不是那些发生透明背景的区域.

我尝试覆盖hitTest::point:withEvent我的自定义控件,不检查alpha值.但是hitTest::point:withEvent当触摸发生在透明控制区域时,甚至都没有调用.我用layer自定义替换了我的控件,CALayer并且hitTest在没有结果的情况下覆盖了它(hitTest在该层上似乎根本没有被调用).


更多细节(编辑)

为了提供一个完美的答案(并赢得赏金),您需要做的就是:

  1. 创建简单的应用程序,添加一个UIControl(例如UIButton).
  2. UIControl(文本UIButton)中删除所有内容并使其背景透明(设置为清除颜色或将Alpha通道设置为0).
  3. 使用addTarget::action:forControlEvents:方法注册UIControlEvents.TouchDown控件上的事件.在handler方法中打印一些东西到控制台.
  4. 运行应用程序,按下控件.什么都没有打印到控制台.让它工作 - 不要使用手势识别器我需要提供的粒度addTarget::action:forControlEvents:.没有黑客解决方案.我知道在控件上设置背景alpha通道0.01会使它突然工作,但这是我不想要的黑客攻击.在这里描述你做了什么.

Rob*_*sey 1

的文档hitTest提到完全透明的事物被忽略,因此覆盖hitTest自身可能不足以解决这个问题,因为hitTest当对象透明时,任何调用都不会调用它。

UIResponder相反,如果您无论如何都需要访问原始触摸事件,我建议您尝试使用较低级别的触摸方法(这些事件是由您继承的UIViewUIControl因此您可以使用)。

他们是:

touchesBegan:withEvent:
touchesMoved:withEvent:
touchesEnded:withEvent:
touchesCancelled:withEvent:
Run Code Online (Sandbox Code Playgroud)

第一个参数是NSSet触摸次数,第二个参数UIEvent就像您在其他方法中提到的那样......

这样,您不需要添加目标操作,而是在自定义控件上覆盖这些方法。这些是较低级别的(并且是极端的老派),但应该让您完全控制触摸事件。