图示问题描述:如下图所示有两个view上下叠加在一起,上层视图有一个蓝色按钮,下层视图有一个红色按钮。正常情况下被覆盖的下层视图的触摸事件会被上层视图覆盖,红色按钮在默认情况下是无法被点击的。
1、自己以前常用的解决方法(覆写pointinside方法)
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
/*
if(point在红色按钮的范围内)
{
return NO;
}
*/
return YES;
}
原理:判断点击范围如果在红色按钮范围内时,上层视图pointInside方法返回NO忽略掉触摸事件。
2、从同事代码里看到的一种方法
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
UIView *view = [super hitTest:point withEvent:event];
if ([view isEqual:self])
{
return nil;
}
return view;
}
原理:先调用系统默认的实现通过hitTest拿到响应触摸事件的view,判断如果是自己(点到空白处了)返回nil忽略掉触摸事件。如果不是(点到控件了)就正常响应。
3、最简单粗暴的方法
在被遮盖控件的上层视图上添加一个同样大小的可交互控件(按钮什么的),然后把背景色设为clearColor(总之看不到就行了)。
4、写在最后
这篇文章主要是为了记录、分享一下2中的代码片段,没有涉及到很复杂的api、原理解释(Orz触摸事件响应链老实说只知道个大概)。纯粹是觉得实现挺取巧的,不用进行复杂的位置判断,叠加在一起的视图只要实现这个方法就可以很方便的向下传递事件。
网友评论