美文网首页
UIView叠加时触摸事件传递问题小记(hitTest)

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

作者: liang1991 | 来源:发表于2018-01-18 15:58 被阅读20次

    问题描述:如下图所示有两个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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/nndwoxtx.html