事件处理机制总结
来源:互联网 发布:app编程工具 编辑:程序博客网 时间:2024/06/05 20:28
本文总结一下事件传递机制和事件响应链的机制。
UIResponder是所有能够响应事件的类的基类,凡是从该类派生的类都可以响应事件。包括UIApplication,UIWindow,UIView(UIView的子类,各种UI控件),UIViewController等。
UITouch,UIEvent,UIGestureRecognizer,UIView,UIResponder之间的关系:
UITouch指一个触控动作。
多个UITouch或键盘操作构成一个UIEvent。
UIGestureRecognizer可以从多个UIEvent中识别出特定手势,实现对手势的响应。
UIResponder类中的方法支持对单个手势的响应。
当触控事件发生时,设置了Gesture Recognizers的View会先通过识别器去拦截触控事件,如果该触控事件是事先为View设定的触控监听事件,那么Gesture Recognizers将会发送动作消息给目标处理对象,目标处理对象则对这次触控事件进行处理。
在由UITouch产生开始识别UIEvent时,会有不同的识别状态:Possible-Began-Changed-Recognized。对应不同的状态,
UIResponder对应有相应的方法可以重载:
当事件产生后,UIKit会产生一个事件对象放至应用的响应queue中。应用从相应队列取出事件后,然后传递至一个初始对象。
初始对象根据事件不同而不同。
touch event的初始对象为Hit-TestView
Motion and remote control events的初始对象为First Responder。
responder chain的机制如下:
在讲解GestureRecgnizer的机制时,提到如下的常规时间传递过程,但是此过程与上述过程是有矛盾的,主要是window得到事件的顺序冲突。经过代码测试,tap和swipe的Gesture,view是在window之前拦截到事件并处理的。 因此下面的流程图特指view上的Gesture优先于view本身先得到事件处理机会,其它流程是不正确的。
比如父UIView的Gesture和子UIView哪个先匹配,多个view的recognizer都匹配同一事件,哪个先匹配。控件对应的addTarget增加的是否是一个recognizer?
确定后答案如下: View是优于父View的Gesture,多个view的recognizer按照级别匹配优先级,子更优先。同级别情况下控件对应的addTarget优先级低于recognizer。
总原则如下(优先级从先至后):子优先于父,gesturerecognizer优先于控件的addTarget。事件被处理了就不会继续传递了(也就是只匹配gesture或addTarget其中一个),但是每个gesture或addTarget可以对应多个选择器,多个选择器都会被执行。
UIResponder中的方法重载之后,优先级为UIView>UIViewController>UIApplication
- 事件处理机制总结
- Android开发中的UI事件监听处理机制总结
- Android开发中的UI事件监听处理机制总结 【转】
- Android开发中的UI事件监听处理机制总结
- 触摸事件的分析与总结----TouchEvent处理机制
- Java知识总结----事件处理机制(九)
- java基础学习总结——java事件处理机制
- 浏览器兼容问题项目总结(三)事件处理机制
- Android事件处理分发机制的总结:一(事件处理)
- C#事件处理机制
- java 事件处理机制
- 事件处理机制
- Flex事件处理机制
- JAVA事件处理机制
- JAVA事件处理机制
- java事件处理机制
- AWT事件处理机制
- Java事件处理机制
- storyboard和nib区别(待总结)
- 数值转化为地址
- 黑马程序员——继承
- 响应式布局二
- 求结构体成员相对地址
- 事件处理机制总结
- 两种动态路由的简单配置
- 绝对地址转化为函数指针
- Kafka基础概念
- codeforces E Square Table
- 如何自动增加和从代码读取Xcode项目的版本号
- c语言中位数的求法 防止越界
- 小猪的数据结构辅助教程——前言
- git配置及多个ssh key的问题