iOS中加载的时候会先执行main函数

  1. int main(int argc, charchar * argv[]) {
  2. @autoreleasepool {
  3. return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  4. }
  5. }

根据main函数的参数加载UIApplication->AppDelegate->UIWindow->UIViewController->superView->subViews
关系为:UIApplication.keyWindow.rootViewController.view.subView
事件传递机制:
1.当iOS程序中发生触摸事件后,系统会将事件加入到UIApplication管理的一个任务队列中
2.UIApplication将处于任务队列最前端的事件向下分发。即UIWindow。
3.UIWindow将事件向下分发,即UIView。
4.UIView首先看自己是否能处理事件,触摸点是否在自己身上。如果能,那么继续寻找子视图。
5.遍历子控件,重复以上两步。
6.如果没有找到,那么自己就是事件处理者。如果
7.如果自己不能处理,那么不做任何处理。
其中 UIView不接受事件处理的情况主要有以下三种
1)alpha <0.01
2)userInteractionEnabled = NO
3.hidden = YES

以下来自网络:
响应者链条概念: iOS系统检测到手指触摸(Touch)操作时会将其打包成一个UIEvent对象,并放入当前活动Application的事件队列,单例的UIApplication会从事件队列中取出触摸事件并传递给单例的UIWindow来处理,UIWindow对象首先会使用hitTest:withEvent:方法寻找此次Touch操作初始点所在的视图(View),即需要将触摸事件传递给其处理的视图,这个过程称之为hit-test view。

UIResponder 是所有响应对象的基类,在UIResponder类中定义了处理上述各种事件的接口。我们熟悉的 UIApplication、 UIViewController、 UIWindow 和所有继承自UIView的UIKit类都直接或间接的继承自UIResponder,所以它们的实例都是可以构成响应者链的响应者对象。

UIWindow实例对象会首先在它的内容视图上调用hitTest:withEvent:,此方法会在其视图层级结构中的每个视图上调用pointInside:withEvent:(该方法用来判断点击事件发生的位置是否处于当前视图范围内,以确定用户是不是点击了当前视图),如果pointInside:withEvent:返回YES,则继续逐级调用,直到找到touch操作发生的位置,这个视图也就是要找的hit-test view。

hitTest:withEvent:方法的处理流程如下: 
首先调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前视图内; 
若返回NO,则hitTest:withEvent:返回nil; 
若返回YES,则向当前视图的所有子视图(subviews)发送hitTest:withEvent:消息,所有子视图的遍历顺序是从最顶层视图一直到到最底层视图,即从subviews数组的末尾向前遍历,直到有子视图返回非空对象或者全部子视图遍历完毕; 
若第一次有子视图返回非空对象,则hitTest:withEvent:方法返回此对象,处理结束; 
如所有子视图都返回非,则hitTest:withEvent:方法返回自身(self)。

一次完整的触摸事件的传递响应的过程
UIApplication --> UIWindow --> 递归找到最适合处理事件的控件
控件调用touches方法 --> 判断是否实现touches方法 --> 没有实现默认会将事件传递给上一个响应者 --> 找到上一个响应者
PS:如果直到UIApplication都不响应,那么这个事件就被废弃了。
1.响应者链条:由很多响应者链接在一起组合起来的一个链条
响应者:继承自UIResponder的对象称之为响应者对象
2.上一个响应者(默认做法是将事件顺着响应者链条向上传递,将事件交给上一个响应者进行处理) 
如何判断当前响应者的上一个响应者是谁?
1>判断当前是否是控制器的View,如果是,上一个响应者就是控制器
2>如果当前不是控制器的View,上一个响应者就是父控件
3.响应者链条有什么用?
可以让一个触摸事件发声的时候让多个响应者同时响应该事件
在子类的实现文件里的touchesBegan:方法里加上如下代码即可
[super touchesBegan:touches withEvent:event]

iOS响应链和传递机制相关推荐

  1. IOS中的事件响应链,事件冒泡机制基本了解

    本文主要讲解IOS中事件响应链,即事件冒泡机制.做过web开发的同学应该知道js事件冒泡是从主响应元素一层一层的向父级冒泡事件,在ios亦是如此,但是不同是ios中,如果冒泡链中有一方对事件进行响应处 ...

  2. iOS 消息的传递机制

    2019独角兽企业重金招聘Python工程师标准>>> 转载原地址:http://beyondvincent.com/blog/2013/12/14/124-communicatio ...

  3. ios 监听一个控制器的属性_iOS 事件(UITouch、UIControl、UIGestureRecognizer)传递机制

    gitHub地址 : 响应链Demo 文章有点长,如果只是想了解大概过程的,可以直接看后面的总结 一.触摸.事件.响应者 1. UITouch源起触摸一个手指一次触摸屏幕,就对应生成一个UITouch ...

  4. iOS学习9_事件分发amp;响应链

    iOS的三种事件:触摸事件/运动事件/远程控制事件 typedef enum { UIEventTypeTouches, UIEventTypeMotion, UIEventTypeRemoteCon ...

  5. iOS中触摸事件传递和响应原理

    系统响应阶段 1.手指触碰屏幕,屏幕感受到触摸后,将事件交由IOKit来处理. 2.IOKIT将触摸事件封装成IOHIDEvent对象,并通过mach port传递给SpringBoard进程. ma ...

  6. 【iOS面试粮食】UI视图—iOS事件的传递机制

    iOS的事件分为3大类型 Touch Events(触摸事件) Motion Events(运动事件,比如重力感应和摇一摇等) Remote Events(远程事件,比如用耳机上得按键来控制手机) 在 ...

  7. iOS-事件响应链、单例模式、工厂模式、观察者模式

    欢迎关注我的iOS学习总结--每天学一点iOS:https://github.com/practiceqian/one-day-one-iOS-summary 一.iOS中事件传递和相应机制 iOS中 ...

  8. iOS响应者链彻底掌握

    点我跳转原文地址 概述 iOS响应者链(Responder Chain)是支撑App界面交互的重要基础,点击.滑动.旋转.摇晃等都离不开其背后的响应者链,所以每个iOS开发人员都应该彻底掌握响应者链的 ...

  9. iOS开发 - 事件传递响应链

    序言 当我们在使用微信等工具,点击扫一扫,就能打开二维码扫描视图.在我们点击屏幕的时候,iphone OS获取到了用户进行了"单击"这一行为,操作系统把包含这些点击事件的信息包装成 ...

最新文章

  1. oracle: 安装客户端
  2. CyclicBarrier(回环栅栏)
  3. 在多个的共享ndk项目之间共享模块
  4. spark work启动失败
  5. 《linux核心应用命令速查》连载一:accton:打开或关闭进程统计
  6. 利用pandas进行简单数据分析——医院销售数据分析案例
  7. java经典算法(三)---zws
  8. 30天不动如山计划(重要)
  9. 思科:DHCP,动态获取IP地址
  10. 0基础学Java需要多久?
  11. 会心自选-淘宝店铺装修和转化率的关系
  12. Linux系统和Windows系统的区别
  13. python处理中文乱码现象
  14. 如何利用计算机班级成绩分析,计算机二级excel真题:制作期末成绩分析表
  15. childnodes与children详解
  16. 【解题报告】博弈专场 (CF 2000~2200)前五题
  17. 51单片机——电子密码锁
  18. vue 渲染函数处理slot_详解Vue的slot新用法
  19. 实战:电表网络中接线
  20. ACdream原创群赛(11)の风神日华神专场 H - XXX的机器人

热门文章

  1. 北科院分子互作实战专题培训班(10月底/11月底班)(生物医药与营养健康协同创新中心)...
  2. js弹出一段html,html js 弹出层
  3. Python使用matplotlib可视化散点图、并在可视化图像的底部和右边添加边缘箱图(Marginal Boxplot)
  4. R语言ggplot2可视化:可视化所有日期不同时段任务的持续时间、将持续时间绘制成一条线(起始时间到结束时间),y轴表示活动发生的日期,x轴表示以小时为单位的时间
  5. R语言ggplot2可视化:自定义函数在箱图(boxplot)上添加分组样本个数(count)、分组均值(mean)、箱体填充色自定义、数据标签色彩自定义
  6. ImportError: cannot import name ‘DtypeArg‘ from ‘pandas
  7. ML基石_4_FeasibilityOfLearning
  8. Linux010 Miniconda安装及使用
  9. 第四次产业革命将由四个领域引领:大数据、新材料、新能源和生物科技。
  10. 统计学习方法-最大熵模型