响应者链条

响应者链条:是由多个响应者对象连接起来的链条

作用:能很清楚的看见每个响应者之间的联系,并且可以让一个事件多个对象处理

响应者对象:能处理事件的对象

iOS中的事件分为三大类型

三大事件

响应者对象

  • 只要继承了UIResponder的对象才能接收并处理事件,我们称之为“响应者对象”
  • UIApplication、UIViewController、UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件
  • UIResponder内部提供了以下方法来处理事件
触摸事件
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

加速计事件
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;

远程控制事件
- (void)remoteControlReceivedWithEvent:(UIEvent *)event;

事件的产生和传递

  • 发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中

  • UIApplication会从事件队列中取出最前面的事件,并将事件发送给应用程序的主窗口(KeyWindow)

  • 主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件,这也是整个事件处理过程的第一步

  • 找到合适的视图控件后,就会调用视图控件的touchs方法来作事件处理

事件传递示例

以下开起来比较直观,但系统如何实现以及工作中如何使用恐怕还是一头雾水


Paste_Image.png

点击了绿色的view:
UIApplication -> UIWindow -> 白色 -> 绿色
点击了蓝色的view:
UIApplication -> UIWindow -> 白色 -> 橙色 -> 蓝色
点击了黄色的view:
UIApplication -> UIWindow -> 白色 -> 橙色 -> 蓝色 -> 黄色

接下来分析事件是如何传递与响应的

事件传递过程

UIApplication --> UIWindow --> ViewController-->subViews -->递归找到最适合处理事件的控件

so 问题来了 如何找到最合适的View?
两个判断标准符,1.自己是否能接受触摸事件 2. 触摸点是否在自己身上?
不符合:证明你不是哦
符合:也不见的是 ,或许你的子控件比你更加合适 所以利用递归找到最适合处理事件的那个子控件 大千世界 茫茫人海 谈何容易 (后面的是废话)

事件响应过程

如上所诉,假设已经找到了最适合View 那么就调用View的touchs方法来处理这个事件吧,ok 响应结束了 ~~

so 问题来了 最合适的View不处理事件呢?
现实中会怎样? 儿子犯事了不敢承担一定会去找他Dad,比如李天一这水货,是吧
ios 也一样 会找到这个View的SuperView, SuperView不处理 会找 SuperView的SuperView,然后UIWindow->UIResponder->UIApplication

so 问题来了 UIApplication也不处理 会怎样?
事件会从UIApplication的队列中移除

队列 与栈有何区别
队列:先进先出 栈:先进后出

最后来两张官方的示意图 至少可以得出一个结论 在事件响应的过程中,View在响应给SuperView的同时会有一个判断,判断自己是不是控制器的View

是:把事件丢给控制器
不是:继续找SuperView

Paste_Image.png

hitTest方法练习

前面在事件传递的过程中提到View怎么判断触摸点在不在自己身上呢?
就是通过hitTest方法
开发中遇到的类似案例分析

Paste_Image.png

前提按钮在greenView下面 并非greenView的子控件
如何在按钮被挡住的情况下 ,让按钮同样能够接受处理事件呢?
介绍一种方法 也许还有更好的
在greenView调用hitTest方法寻找最合适的View的同时 如果点在了按钮的区域 ,即使触摸点并不在按钮上面 我也认定按钮就是最合适的控件 让按钮来处理事件
我创建greenView继承自UIView来管理绿色view
上代码:

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
    //  转化为按钮上的坐标
     CGPoint btnPoint = [self convertPoint:point toView:self.btn];
    
    //   判断在不在按钮上面
    if ([self.btn pointInside:btnPoint withEvent:event]) {
        return  self.btn;     
    }
    // 如果不在按钮的区域  那么返回greenView为最合适的控件
    return self;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容