美文网首页
点击事件传递

点击事件传递

作者: 大心脏 | 来源:发表于2017-06-23 13:08 被阅读27次

参考自:一篇搞定事件传递、响应者链条、hitTest和pointInside的使用

事件的传递,主要是理解UIView两个方法

1.hitTest:withEvent:

2.pointInside:withEvent:

图.1

如图1,绿色(CustomViewB)和黄色(CustomViewC)是黑色(CustomViewA)的子视图,白色(CustomViewD)是黄色的子视图

在每个自定义的视图内重写以下三个方法

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event {

NSLog(@"%s", __func__);

}

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

NSLog(@"%s", __func__);

// 是否是可以点击的

if (!self.userInteractionEnabled || self.alpha < 0.01) return nil;

// 判断触摸点是否在自己范围内

if(![self pointInside:point withEvent:event]) return nil;

// 判断是否还有更合适的视图

NSInteger count = self.subviews.count;

for (NSInteger i = (count - 1); i >= 0; i--) {

UIView *childView = self.subviews[i];

CGPoint chindPoint = [self convertPoint:point toView:childView];

UIView *fileView = [childView hitTest:chindPoint withEvent:event];

if (fileView) {

return fileView;

}

}

return self;

}

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {

BOOL result = CGRectContainsPoint(self.bounds, point);

NSLog(@"%d-%s",  result, __func__);

return result;

}

一:响应事件分析

1.点击3区域(1,2,4,7区域类似)

2017-06-23 12:42:14.763 sfasd[11534:6414261] -[CustomViewA hitTest:withEvent:]

2017-06-23 12:42:14.763 sfasd[11534:6414261] 1--[CustomViewA pointInside:withEvent:]

2017-06-23 12:42:14.764 sfasd[11534:6414261] -[CustomViewC hitTest:withEvent:]

2017-06-23 12:42:14.764 sfasd[11534:6414261] 1--[CustomViewC pointInside:withEvent:]

2017-06-23 12:42:14.764 sfasd[11534:6414261] -[CustomViewD hitTest:withEvent:]

2017-06-23 12:42:14.765 sfasd[11534:6414261] 0--[CustomViewD pointInside:withEvent:]

2017-06-23 12:42:14.765 sfasd[11534:6414261] -[CustomViewA hitTest:withEvent:]

2017-06-23 12:42:14.765 sfasd[11534:6414261] 1--[CustomViewA pointInside:withEvent:]

2017-06-23 12:42:14.769 sfasd[11534:6414261] -[CustomViewC hitTest:withEvent:]

2017-06-23 12:42:14.773 sfasd[11534:6414261] 1--[CustomViewC pointInside:withEvent:]

2017-06-23 12:42:14.774 sfasd[11534:6414261] -[CustomViewD hitTest:withEvent:]

2017-06-23 12:42:14.774 sfasd[11534:6414261] 0--[CustomViewD pointInside:withEvent:]

2017-06-23 12:42:14.776 sfasd[11534:6414261] -[CustomViewC touchesBegan:withEvent:]

点在3区域,黑色视图先判断点击的点也位于自己的范围内,看看有没有比黑色视图更合适的响应位置,遂倒序遍历自己的子视图;然后黄色视图判断是否在自己的子视图内,发现点击区域位于子视图之外,则没找到更合适的响应视图,只好返回自己;这样一层层的返回,黑色视图返回黄色视图给上一级的视图....最后,最佳的响应视图便是黄色视图,所以[CustomViewC touchesBegan:withEvent:]

2.点击6区域(区域5类似)

2017-06-23 12:55:25.946 sfasd[11534:6414261] -[CustomViewA hitTest:withEvent:]

2017-06-23 12:55:25.947 sfasd[11534:6414261] 1--[CustomViewA pointInside:withEvent:]

2017-06-23 12:55:25.947 sfasd[11534:6414261] -[CustomViewC hitTest:withEvent:]

2017-06-23 12:55:25.947 sfasd[11534:6414261] 0--[CustomViewC pointInside:withEvent:]

2017-06-23 12:55:25.947 sfasd[11534:6414261] -[CustomViewB hitTest:withEvent:]

2017-06-23 12:55:25.948 sfasd[11534:6414261] 0--[CustomViewB pointInside:withEvent:]

2017-06-23 12:55:25.948 sfasd[11534:6414261] -[CustomViewA hitTest:withEvent:]

2017-06-23 12:55:25.948 sfasd[11534:6414261] 1--[CustomViewA pointInside:withEvent:]

2017-06-23 12:55:25.950 sfasd[11534:6414261] -[CustomViewC hitTest:withEvent:]

2017-06-23 12:55:25.950 sfasd[11534:6414261] 0--[CustomViewC pointInside:withEvent:]

2017-06-23 12:55:25.951 sfasd[11534:6414261] -[CustomViewB hitTest:withEvent:]

2017-06-23 12:55:25.952 sfasd[11534:6414261] 0--[CustomViewB pointInside:withEvent:]

2017-06-23 12:55:25.954 sfasd[11534:6414261] -[CustomViewA touchesBegan:withEvent:]

点在6区域,黑色视图先判断点击的点也位于自己的范围内,看看有没有比黑色视图更合适的响应位置,遂倒序遍历自己的子视图;结果都不在自己的子视图内,所以返回自己,[CustomViewA touchesBegan:withEvent:]被调用

结论:1.点击会从父视图倒序遍历自己的自视图,寻找到最合适的响应视图返回;

        2.点击子视图的点超出父视图的范围,子视图无法响应,位于点击的点之下的最近的一个视图会响应事件.

二:点击子视图的点超出父视图的范围无法响应事件的处理

相关文章

  • (四)react事件

    一、 添加点击事件onClick 点击事件传递参数 二、es6语法传参 添加点击事件onClick 点击事件传递参数

  • 点击事件传递

    参考自:一篇搞定事件传递、响应者链条、hitTest和pointInside的使用 事件的传递,主要是理解UIVi...

  • 《Android 开发艺术探索》笔记4--View事件分发与滑动

    View事件分发机制 点击事件传递规则 所谓点击事件的事件分发,就是对MotionEvent事件的分发过程,传递给...

  • View事件传递机制源码解析

    点击事件的传递规则 点击事件,说直接一点就是MotionEvent对象,事件的传递,就是将MotionEvent对...

  • 三、自定义View ( 事件分发机制 )

    事件的传递规则 一、点击事件(MotionEvent),当点击事件发生后,系统是如何将一个事件传递到view的过程...

  • iOS 事件传递与响应链

    问题 1. iOS点击事件怎么传递到被点击的view的 如下图,点击蓝色view,点击事件是如何传递并最终确认被点...

  • Flutter基础(二)

    列表的点击事件 onTap 点击事件 onLongPress 长按事件 页面跳转传递参数 Navigator.pu...

  • UIView 点击事件传递

    (nullable UIView *)hitTest:(CGPoint)point withEvent:(null...

  • 点击事件的传递

    背景 最近要做一个页面形状如下 一看,非常简单。三个view就处理好了一个透明的view、一个灰色的view和透明...

  • View事件分发(一)

    View事件分发 点击事件的传递规则 点击事件首先要分析的对象就是MotionEvent,即点击事件,其实所谓的点...

网友评论

      本文标题:点击事件传递

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