ios开发事件处理之:三 :寻找最合适的view
1:事件的产生与传递:

2:寻找最合适的view:如何查找最合适的view:需要三步:1:先判断自身是否能接受触摸事件 2:判断触摸点是否在自己身上 3:若前两条都满足,则其会从后往前遍历所有子控件(从后往前遍历是考虑到效率的问题,后指的是子控件数组中的最后一个控件)继续重复12步骤,直到找到最合适的子控件。(控件不能接受触摸事件的三个条件,事件是由父控件传递到子控件,若是父控件都不能接受事件,那么子控件肯定也不能接受事件)
:

注意:从后往前遍历子控件:永远遍历的是子控件数组中的最后一个,也就是最后添加到父视图上的子控件
上图中的子控件的添加顺序:1:先添加的是红色的控件view,再添加蓝色的控件view,随后添加黄色,绿色,最后添加紫色
例如:当点击绿色的view后,系统会将事件发送到UIApplecation管理的事件队列中,UIApplecation会从事件队列中取出最前端的事件交给主窗口KeyWindow,此时KeyWindow做判断自己可以接受触摸事件,触摸点在自己的身上,满足两个条件,此时KeyWindow会寻找有没有更合适的view,此时KeyWindow会从后往前遍历子控件,拿到子控件白色的view后继续判断是否满足两个条件,不满足则事件不会继续传递,若满足,则白色的view又会从后往前遍历子控件,先查看白色控件子控件数组中的最后一个也就是蓝色控件,在查看紫色的view,在查看黄色的view,再看看绿色的view,是否满足条件,不满足则停止传递或是继续传递给子控件,停止传递的原因就是涉及到用户交互的问题,若是子控件也不能接收事件,则此时自己也就是父视图为最合适的view,父视图会对此事件进行处理(ViewUI,最顶层是UIWindow,记住最重要一点是:事件的传递是由父控件传递到子控件,父控件不能接受事件则子控件也不能接收事件,控件不能接受触摸事件的三个条件)
3:事件传递调用的最底层的方法:1:当view接收到触摸事件的时候就会调用,-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 方法底层会调用,-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event。在调用第一个方法的时候会先调用第二个方法。2:一般若是想反悔任意一个view处理点击事件,则一般考虑在父视图中重写两个方法,在第一个方法中反回子控件的view
//作用:去寻找最适合的View
//什么时候调用:当一个事件传递给当前View,就会调用.
//返回值:返回的是谁,谁就是最适合的View(就会调用最适合的View的touch方法)
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
NSLog(@"%s",__func__);
UIView *fitView = [super hitTest:point withEvent:event];
//NSLog(@"%@",fitView);
//return self.subviews[0];
return fitView;
}
//作用:判断当前点在不在它调用View,(谁调用pointInside,这个View就是谁)
//什么时候调用:它是在hitTest方法当中调用的.
//注意:point点必须得要跟它方法调用者在同一个坐标系里面
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
NSLog(@"%s",__func__);
return NO;
}
ios开发事件处理之:三 :寻找最合适的view的更多相关文章
- 寻找最合适的view
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- ios开发事件处理之 四:hittest方法的底层实现与应用
#import "XMGWindow.h" /** 1:注意点:hitTest方法内部会调用pointInside方法,询问触摸点是否在自己身上,当遍历子控件时,传入的坐标点要进行 ...
- ios开发事件处理之 :二:事件的产生与传递
1.事件是怎么样产生与传递的? 当发生一个触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中.(队列是先进先出,而栈是先进后出) UIApplication会从事件队列中 ...
- IOS开发之路三(XML解析之KissXML的使用)
最近再做一个项目需要用到xml的解析.今天查了一些资料自己做了一个小demo.纯OC没有界面.. 在IOS平台上进行XML文档的解析有很多种方法,在SDK里面有自带的解析方法,但是大多情况下都倾向于用 ...
- IOS开发之路三(XML解析之GDataXML的使用)
最近再做一个项目需要用到xml的解析.今天查了一些资料自己做了一个小demo.纯OC没有界面.. 在IOS平台上进行XML文档的解析有很多种方法,在SDK里面有自带的解析方法,但是大多情况下都倾向于用 ...
- ios开发runtime学习三:动态添加方法(实际应用少,面试)
#import "ViewController.h" #import "Person.h" /* 1: Runtime(动态添加方法):OC都是懒加载机制,只要 ...
- iOS 开发:TCP三次握手连接
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握 ...
- 【Swift 2.2】iOS开发笔记(三)
1.UITableView 中调用 UIButton 的 setTitle 会闪 滚动列表时比较明显,解决办法: buttonType 改成 custom 即可,但是这样一来 UIButton 的高亮 ...
- iOS开发常用第三库
字典转模型 1.(MJExtension) https://github.com/CoderMJLee/MJExtension 2.(YYModel) https://github.com/ibire ...
随机推荐
- BZOJ3277: 串(后缀自动机,Parent树,Dfs序)
Description 字符串是oi界常考的问题.现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中 至少k个字符串的子串(注意包括本身). Input 第一行两个整数n, ...
- 洛谷P3613 睡觉困难综合征(LCT)
题目: P3613 睡觉困难综合症 解题思路: LCT,主要是维护链上的多位贪心答案,推个公式:分类讨论入0/1的情况,合并就好了(公式是合并用的) 代码(我不知道之前那个为啥一直wa,改成结构体就好 ...
- Flask项目之手机端租房网站功能测试(完结)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 目录 一丶注册和登录以及用户退出功能 二丶上传头像功能和修改用户名功能测试 三丶发布房源以及实名认证功能测试 四丶网站房屋搜索功能 ...
- 98.TCP通信传输文件
客户端 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include <stdlib.h> #include <s ...
- 1.15 Python基础知识 - 函数
函数是可重用的程序代码段. 一.函数的声明和调用 声明格式: def 函数名([形参列表]): 函数体 调用格式: 函数名([实参列表]) 函数名:是一种标识符,命名规则为全小写字母,可以使用下划线增 ...
- 有关Canvas的一点小事--鼠标绘图
1. 如何根据鼠标位置获取canvas上对应位置的x,y. 2. canvas的图糊了,设置宽和高的方式不对. 3.鼠标绘图代码 之前听说过canvas这个元素,但是实际上并没有深入了解过.不过日 ...
- 洛谷——U10206 Cx的治疗
https://www.luogu.org/problem/show?pid=U10206 题目背景 「Cx的故事」众所周知,Cx是一个宇宙大犇.由于Cx在空中花园失足摔下,导致他那蕴含着无穷智慧的大 ...
- Android之——图片的内存优化
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46972817 1. 对图片本身进行操作 尽量不要使用 setImageBitmap ...
- 关于python的深浅拷贝、赋值
https://blog.csdn.net/weixin_39750084/article/details/81435454
- (转) centos安装oracle11.2 pdksh软件包的说明
对于pdksh软件包,可从以下URL下载:ftp://fr2.rpmfind.net/linux/PLD/dists/ac/ready/i686/pdksh-5.2.14-33.i686.rpm由于该 ...