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 ...
随机推荐
- 15.Node.js REPL(交互式解释器)
转自:http://www.runoob.com/nodejs/nodejs-tutorial.html Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电 ...
- @JSONField 注解说明
转自:https://blog.csdn.net/suyimin2010/article/details/80617538 导入@JSONField 注解: import com.alibaba.fa ...
- 洛谷P1043 数字游戏
题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分 ...
- 不用浏览器,直接用代码发送文件给webservices所在服务器 并且可以周期行的发送
package com.toic.test; import java.io.DataInputStream; import java.io.DataOutputStream; import java. ...
- SGU 253 Theodore Roosevelt 快速判断点是否在凸包内
http://acm.sgu.ru/problem.php?contest=0&problem=253 题意简单易懂...给你n个点的凸包(经测试已经是极角序)...判断m个点是否在凸包内.. ...
- Linux 服务器初始配置步骤
1.IP配置 vim /etc/sysconfig/network-scripts/ifcfg- BOOTPROTO=dhcp 改成 static ONBOOT=no 改成 yes 添加 IPADDR ...
- CODEVS——T1332 上白泽慧音 || 洛谷——P1726 上白泽慧音
http://codevs.cn/problem/1332/|| https://www.luogu.org/problem/show?pid=1726#sub 时间限制: 1 s 空间限制: 1 ...
- 用VBS控制鼠标,在Excel2010、2013,64位中
原作者文章地址:http://demon.tw/programming/vbs-control-mouse.html 感谢原作者的攻略.才使我学会用VBS控制鼠标. 但是问题接踵而至,Excel200 ...
- quartz中的corn表达式(转)
Quartz的cron表达式 一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素. 按顺序依次为 秒(0~59) 分钟(0~59) 小时(0~23) 天(月)(0~31,可是你须要考虑你月 ...
- canvas画板基础应用的学习
canvas是html5中的绘图容器,我们可以通过javascript的控制来进行图形的绘制,绘制对象可以是路径.盒.圆.字符等,同时,你也可以通过js给画布添加图像,下面来介绍canvas的各种基本 ...