vbs按钮传递过程_iOS面试题:事件传递和响应机制
1. 事件的产生
- 发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的
事件队列
中,为什么是队列而不是栈?因为队列的特点是FIFO,即先进先出,先产生的事件先处理才符合常理,所以把事件添加到队列。 UIApplication
会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口(keyWindow)
。- 主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件,这也是整个事件处理过程的第一步。
找到合适的视图控件后,就会调用视图控件的touches方法来作具体的事件处理。
2. 事件的传递
- 触摸事件的传递是从父控件传递到子控件
- 也就是UIApplication->window->寻找处理事件最合适的view
注 意: 如果父控件不能接受触摸事件,那么子控件就不可能接收到触摸事件
3. 应用如何找到最合适的控件来处理事件?
- 1.首先判断主窗口(keyWindow)自己是否能接受触摸事件
- 2.判断触摸点是否在自己身上
- 3.子控件数组中从后往前遍历子控件,重复前面的两个步骤(所谓从后往前遍历子控件,就是首先查找子控件数组中最后一个元素,然后执行1、2步骤)
- 4.如果没有符合条件的子控件,那么就认为自己最合适处理这个事件,也就是自己是最合适的view。
3.1 寻找最合适的view底层剖析
两个重要的方法:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
3.2 hitTest:withEvent 方法介绍
什么时候调用?
- 只要事件一传递给一个控件,这个控件就会调用他自己的hitTest:withEvent:方法
作用
- 寻找并返回最合适的view(能够响应事件的那个最合适的view)
注 意
1.不管这个控件能不能处理事件,也不管触摸点在不在这个控件上,事件都会先传递给这个控件,随后再调用hitTest:withEvent:方法
2.如果hitTest:withEvent:方法中返回nil,那么调用该方法的控件本身和其子控件都不是最合适的view,也就是在自己身上没有找到更合适的view。那么最合适的view就是该控件的父控件。
3.3 pointInside:withEvent 方法介绍
判断点在不在当前view上(方法调用者的坐标系上)如果返回YES,代表点在方法调用者的坐标系上;返回NO代表点不在方法调用者的坐标系上,那么方法调用者也就不能处理事件。
UIView不能接收触摸事件的三种情况:
不允许交互
:userInteractionEnabled = NO隐藏
:如果把父控件隐藏,那么子控件也会隐藏,隐藏的控件不能接受事件透明度
:如果设置一个控件的透明度<0.01,会直接影响子控件的透明度。alpha:0.0~0.01为透明。
4. 事件的响应
4.1 触摸事件处理的整体过程
- 1 用户点击屏幕后产生的一个触摸事件,经过一系列的传递过程后,会找到最合适的视图控件来处理这个事件
- 2 找到最合适的视图控件后,就会调用控件的touches方法来作具体的事件处理touchesBegan…touchesMoved…touchedEnded…
- 3 这些touches方法的默认做法是将事件顺着响应者链条向上传递(也就是touch方法默认不处理事件,只传递事件),将事件交给上一个响应者进行处理
4.2 响应者链条
在iOS程序中无论是最后面的UIWindow还是最前面的某个按钮,它们的摆放是有前后关系的,一个控件可以放到另一个控件上面或下面,那么用户点击某个控件时是触发上面的控件还是下面的控件呢,这种先后关系构成一个链条就叫响应者链
。也可以说,响应者链是由多个响应者对象连接起来的链条
。
在iOS中响应者链的关系可以用下图表示:
响应者对象
能处理事件的对象,也就是继承自UIResponder的对象
作用
能很清楚的看见每个响应者之间的联系,并且可以让一个事件多个对象处理。
如何判断上一个响应者
- 1 如果当前这个view是控制器的view,那么控制器就是上一个响应者
- 2 如果当前这个view不是控制器的view,那么父控件就是上一个响应者
响应者链的事件传递过程
- 1 如果当前view是控制器的view,那么控制器就是上一个响应者,事件就传递给控制器;如果当前view不是控制器的view,那么父视图就是当前view的上一个响应者,事件就传递给它的父视图
- 2 在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理
- 3 如果window对象也不处理,则其将事件或消息传递给UIApplication对象
- 4 如果UIApplication也不能处理该事件或消息,则将其丢弃
5. 总结
事件处理的整个流程总结:
- 1.触摸屏幕产生触摸事件后,触摸事件会被添加到由UIApplication管理的事件队列中(即,首先接收到事件的是UIApplication)。
- 2.UIApplication会从事件队列中取出最前面的事件,把事件传递给应用程序的主窗口(keyWindow)。
- 3.主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件。(至此,第一步已完成)
- 4.最合适的view会调用自己的touches方法处理事件
- 5.touches默认做法是把事件顺着响应者链条向上抛。
如何做到一个事件多个对象处理:
因为系统默认做法是把事件上抛给父控件,所以可以通过重写自己的touches方法和父控件的touches方法来达到一个事件多个对象处理的目的。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ // 1.自己先处理事件...NSLog(@"do somthing...");// 2.再调用系统的默认做法,再把事件交给上一个响应者处理[super touchesBegan:touches withEvent:event];
}
事件的传递和响应的区别:
事件的传递是从上到下(父控件到子控件),事件的响应是从下到上(顺着响应者链条向上传递:子控件到父控件。
更多:iOS面试题合集
vbs按钮传递过程_iOS面试题:事件传递和响应机制相关推荐
- 屏幕旋转之后的触摸坐标_iOS 中触摸事件传递和响应原理
作者:雪山飞狐_91ae 链接:https://www.jianshu.com/p/4aeaf3aa0c7e 系统响应阶段 1.手指触碰屏幕,屏幕感受到触摸后,将事件交由IOKit来处理. 2.IOK ...
- IOS升级到13后发现左划的自定义按钮不存在了,但是事件依旧可以响应
今天,升级到IOS13后,发现原来的左划按钮,不存在了,但是按钮位置的时间响应确实存在的. 经过输出日志,定位问题终于发现了原因. 原来关键绘制左划自定义按钮代码如下: for (UIView *su ...
- android方向触摸事件,Android触摸事件传递机制,这一篇就够了
整个触摸事件牵涉到的是,Activity,View,ViewGroup三者的传递机制. 这个触摸事件就是从外层往内层一层层的传递. 整个传递机制,分为3个步骤:分发,拦截,和消费. 1. 触摸事件的类 ...
- Android事件传递机制(转)
Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作.所有这些都构成了Android中的事件响应.总的来说,所有的事件都 ...
- iOS中触摸事件传递和响应原理
系统响应阶段 1.手指触碰屏幕,屏幕感受到触摸后,将事件交由IOKit来处理. 2.IOKIT将触摸事件封装成IOHIDEvent对象,并通过mach port传递给SpringBoard进程. ma ...
- Android事件机制:事件传递和消费
Android中的事件在表现形式上有很多,如onTach.onClick和onLongClick等,在具体微观上的表现形势有action_down.action_move和action_up等. ...
- Android 中Touch(触屏)事件传递机制
版本:2.0 日期:2014.3.21 2014.3.29 版权:© 2014 kince 转载注明出处 一.基本概念 在实际开发中,经常会遇到与触屏事件有关的问题,最典型的一个就是滑动冲突.比如在使 ...
- 【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )
Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...
- android touch事件坐标原点,图解Android:Touch事件传递机制
前言 Android事件管理机制是一名专业Android研发工程师必须要了解的核心知识之一,深入了解一下该机制无论对我们日常开发还是找工作,乃至于对我们的架构思想都有很大的帮助.Android中我们用 ...
最新文章
- CSS Border属性solid(实线)使用介绍
- python爬取贴吧所有帖子-python爬取贴吧帖子
- 使用SpringBoot框架和SpringSecurity框架整合出现because its MIME type ('text/html') is not executable
- 关于出去还是不出去的选择
- 《Python知识手册》,高清pdf免费获取
- Linux下,C++编程论坛题目抽取
- linux虚拟服务器新增磁盘怎么挂载,如何在vmware虚拟机Linux中增加硬盘的方法(教程)...
- 程序员面试金典 - 面试题 04.12. 求和路径(二叉树递归)
- LeetCode 657. 机器人能否返回原点
- 【CTF】某xss练手小游戏
- Reg“.NET研究”exOptions.Compiled的含义和使用
- 如何建立内核级钩子控制操作系统实现程序隐身
- python-学生管理系统--1框架部分内容以及代码
- 郭克华老师java视频教程下载地址
- 捷联惯导基础知识解析之二(捷联惯导更新算法和误差方程)
- html 源码_html制作个人博客网站模板源码下载
- 熵增定律:为什么熵增理论让好多人一下子顿悟了
- Rhino6.5软件安装包详细安装教程
- 区块链相关的关键概念
- 安卓手机文件管理器内置FTP服务器无需安装任何软件共享安卓文件wifi下手机共享电脑文件