UIView叠加时触摸事件传递问题小记(hitTest)

问题描述:如下图所示有两个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触摸事件响应链老实说只知道个大概)。纯粹是觉得实现挺取巧的,不用进行复杂的位置判断,叠加在一起的视图只要实现这个方法就可以很方便的向下传递事件。

5、Demo地址

MGesView

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。