【发布时间】:2014-12-26 00:16:30
【问题描述】:
我有一个自定义的UIControl,其中包含一些其他控件。在这些控件之间有空白空间,我的UIControl 的背景需要是透明的。
我需要捕捉发生在我的自定义 UIControl 上的所有触摸事件,即使它们仅发生在其他控件之间(在透明区域上)。我不能使用手势识别器,我需要比他们提供的更多控制。相反,我想注册触摸处理功能,如下所示:
myControl.addTarget(self, action: "handleTouchDown:event:", forControlEvents: UIControlEvents.TouchDown)
通过这种方法,我收到了在myControl 的非透明区域上发生的触摸,但不是那些在透明背景下发生的触摸。
我尝试在我的自定义控件中覆盖 hitTest::point:withEvent 以不检查 alpha 值。但是当触摸发生在透明的控制区域上时,甚至不会调用hitTest::point:withEvent。我用自定义的CALayer 替换了我的控件的layer 并覆盖了hitTest 也没有结果(层上的hitTest 似乎根本没有被调用)。
更多细节(编辑)
要提供完美的答案(并赢得赏金),您需要做的就是:
- 创建简单的应用,添加一个
UIControl(例如UIButton)。 - 删除
UIControl中的所有内容(UIButton中的文本)并使其背景透明(设置为清除颜色或将 Alpha 通道设置为 0)。 - 使用
addTarget::action:forControlEvents:方法在控件上注册UIControlEvents.TouchDown事件。在处理程序方法中打印一些内容到控制台。 - 运行应用程序,按下控件。没有任何东西被打印到控制台。让它工作 - 不要使用手势识别器 我需要
addTarget::action:forControlEvents:提供的粒度。没有黑客解决方案是首选。我知道将控件上的背景 alpha 通道设置为0.01会使其突然工作,但这是我不想要的一种黑客行为。在这里描述你做了什么。
【问题讨论】:
-
如果我将
UIControl的背景颜色设置为带有 alpha0.01的颜色,一切正常,我会得到我需要的所有触摸事件。但这就是黑客行为,它正在影响透明控件的视图颜色。 -
你试过
view.backgroundColor = [UIColor clearColor]吗? -
@Nikita 是的,我确实做到了。它没有帮助。
-
您确定您的
UIControl在视图层次结构中的正确位置吗?检查视图层次结构的顺序。 -
使用手势识别器委托方法
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch,您可以精确地指定手势将传递给识别器的位置。您不能只指定控件的视图来接收触摸吗? (如果触摸超过您的一个子控制器,则拒绝触摸。)
标签: ios cocoa-touch uiview hittest uicontrol