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在该层上似乎根本没有被调用).
为了提供一个完美的答案(并赢得赏金),您需要做的就是:
UIControl(例如UIButton).UIControl(文本UIButton)中删除所有内容并使其背景透明(设置为清除颜色或将Alpha通道设置为0).addTarget::action:forControlEvents:方法注册UIControlEvents.TouchDown控件上的事件.在handler方法中打印一些东西到控制台.addTarget::action:forControlEvents:.没有黑客解决方案.我知道在控件上设置背景alpha通道0.01会使它突然工作,但这是我不想要的黑客攻击.在这里描述你做了什么.的文档hitTest提到完全透明的事物被忽略,因此覆盖hitTest自身可能不足以解决这个问题,因为hitTest当对象透明时,任何调用都不会调用它。
UIResponder相反,如果您无论如何都需要访问原始触摸事件,我建议您尝试使用较低级别的触摸方法(这些事件是由您继承的UIView,UIControl因此您可以使用)。
他们是:
touchesBegan:withEvent:
touchesMoved:withEvent:
touchesEnded:withEvent:
touchesCancelled:withEvent:
Run Code Online (Sandbox Code Playgroud)
第一个参数是NSSet触摸次数,第二个参数UIEvent就像您在其他方法中提到的那样......
这样,您不需要添加目标操作,而是在自定义控件上覆盖这些方法。这些是较低级别的(并且是极端的老派),但应该让您完全控制触摸事件。