透明部分传递触摸事件给父视图

4

我有一个简单的应用程序,当用户在主视图中点击UIButton时,在主视图上方添加一个子视图。这个子视图的大小为480x320(我处于横向模式),但是这个子视图中心图像周围有一个透明的边框。

这就是我的问题所在。我希望只有子视图在从父视图中移除之前才处理触摸事件,但如果在透明边框上发生了触摸事件,则事件会被传递到父视图,并忽略子视图,即使子视图是窗口的全尺寸。

通过一些研究,似乎这正是苹果公司希望发生的,因为即使子视图是窗口的全尺寸,触摸事件也只会传递到不透明的部分。它在参考文献中有解释:

http://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MultitouchEvents/MultitouchEvents.html

我希望能够设置触摸事件始终停留在子视图中,无论透明度如何。hitTest:withEvent:方法似乎可以做到这样的事情,但更多是将触摸事件传递给不同的子视图而不是被触摸的那个子视图。
有没有人有解决方案/变通方法可以实现这一点?
3个回答

5
简单的解决方案是创建你的子视图的子类,并添加以下空方法...
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
}

这将防止触摸事件传递到父视图,即使用户触摸视图的透明部分也是如此。

2

你应该在xib的后面放置一个清除按钮,这样可以防止触摸事件的发生。


对于任何需要的人,这个解决方案是有效的,只要你将 UIButtonexclusiveTouch 属性设置为 YES - msgambel

1
如果您将子视图的backgroundColor设置为隐藏,您将获得相同的效果(在UIButton周围有一个透明边框),并且您的视图将接收到触摸事件:
您可以在添加子视图之前执行此代码:
subview.backgroundColor = [UIColor clearColor];
subview.hidden = NO;
[parentView addSubview:subview];

我不认为这是正确的,因为在nib中将背景色设置为clear和编程方式设置背景色是相同的。而且,你仍然会有一个透明的背景颜色,并且根据苹果公司的链接,触摸事件会被子视图忽略并发送到父视图。 - msgambel
它对我有效。这是我一个类的代码(SDSTransparentView.m,位于https://github.com/sdesimone/iOSSnippets),我使用它来拦截添加为子视图的`UIView`之外的触摸事件。如果您想尝试,请使用它... - sergio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接