iOS事件处理-响应者和响应者链

原文地址:https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/understanding_event_handling_responders_and_the_responder_chain
如原作者发现有侵权行为可责令我在24小时之内删除,前提是你能看到。
翻译者:毛毛可


学习事件是怎样在你的app中传递的,并学会应该如何处理它们.

Apps使用responder(响应者对象)对象来接受并处理事件.一个responder对象可以是任意一个UIResponder类的实例,其中包括其子类UIView,UIViewController和UIApplication.

responder对象在接收到原始的事件对象,必须处理它或者将它继续向前传递给下一个responder对象.当你的app在接收到一个事件时,UIKit框架会自动的找到最合适的responder去处理该事件,这就是第一响应者.

未处理的事件会在响应者链中从这个responder传递给下一个responder.事实上你的app中没有单独的响应者链.UIkit定义了responder传递的默认规则,当然你可以通过覆盖responder对象中对应的属性来更改规则.

图一

图一 显示了一条默认的响应者链,包括一个label,一个text field,一个button和两个background view.如果text field不去处理事件,那么UIKit会将事件发送给textfield的父视图对象.接着就是window的root view.从root view出来,会顺着响应者链在到达window对象之前先传递给view controller.如果此时window也不处理此事件,UIKit会将事件分发给UIApplication对象,或者是分发给app delegate,app delegate是一个UIResponder实例,但此过程已经不是响应者链中的一部分了.

确定事件的第一响应者

针对每种类型的事件,UIKit指定了第一响应者,将事件发送给第一响应者.第一响应者的确定是基于事件的类型的.

Touch事件
第一响应者就是触摸发生的view.

Press事件
第一响应者是注册了focus的响应者对象.

摇动事件
第一响应者是你指定的相应对象.

远程控制事件
第一响应者是你指定的相应对象.

编辑菜单信息
第一响应者是你指定的相应对象.

Note
运动事件相关的加速,陀螺仪和磁力计都不会出现在响应者链中.Core MOtion会派发这些事件给你对应注册的对象.

UIControl控件会直接通过相关联的target-action传送事件.
当界面中的是UIControl控件时,UIControl会调用target对象的action方法,或者说返送一个action消息给其target对象.
action消息不是一个事件,但是依然可以利用响应者链.当UIControl对象的target为nil时,UIKit开始从target对象并顺着响应者链找,直到找到一个实现了相关action方法的对象.举例,UIKit editing menu使用这种行为去搜索对应responder对象的相关实现方法比如cut:,copy:或者paste:.

如果在view中有附加的手势识别器,手势识别器会在在view之前接收到touch和press事件.如果view中所有的手势识别都没有识别成功,事件会传给view去处理.如果此view没有处理它们,UIKit会继续传给响应者链的上一层.关于更多的手势识别器处理事件,请参考UIKit Gestures.

确定哪个Responder包含Touch事件

UIKit使用 基于view的hit-testing方式去确定touch事件发生的位置.具体来说,UIKit会将touch的位置与在view层级中的view对象的容器范围比较.UIView的hitTest:withEvent:方法随着view层级,查找包含touch的最深层的子view.这个view将成为touch事件的第一响应者.

Note
如果touch的位置超出了view的范围,hitTest:withEvent:方法会忽略此view及其所有子view.因此,当view的clipsToBounds属性为NO时,即使包含了touch,超出view范围的子view也不会有效.更多关于hitTest:withEvent:方法的行为,请查看view的hitTest:withEvent:方法.

UIkit总会赋值给view其范围范围的每个touch.当触摸发生时,UIKit创建UITouch对象,直到触摸结束后才释放touch对象.如果触摸的位置或者其他参数改变了,UIKit会及时更新UITouch对象的信息.只有一个属性不可能发生改变就是是否在view范围中.及时当触摸位置移出了原view,touch对象的属性也不会改变.

改变响应者链

你可以通过重载responder对象的nextResponder属性来改变响应者链.你可以在此方法(getter)返回下一个响应者.

许多UIKit的类已经重载了这个属性,返回了指定的对象.

UIView对象,如果view是view controll的根视图,那么view的下个响应者就是view controller,否者下一个响应者就是view的父视图.

UIViewController对象.
如果一个vc是被另一个vcpresent出来的,那么vc的下一个响应者就是present它出来的那个vc
如果window的根视图是view controller.view,那么view controller的下一个响应者就是window对象.

window对象.window的下一个responder是UIApplication对象.

UIApplication对象.下一个响应者是app delegate.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • 好奇触摸事件是如何从屏幕转移到APP内的?困惑于Cell怎么突然不能点击了?纠结于如何实现这个奇葩响应需求?亦或是...
    Lotheve阅读 54,734评论 51 596
  • 在iOS开发中经常会涉及到触摸事件。本想自己总结一下,但是遇到了这篇文章,感觉总结的已经很到位,特此转载。作者:L...
    WQ_UESTC阅读 5,871评论 4 26
  • 在开发过程中,大家或多或少的都会碰到令人头疼的手势冲突问题,正好前两天碰到一个类似的bug,于是借着这个机会了解了...
    闫仕伟阅读 5,157评论 2 23
  • 重点参考链接: View Programming Guide for iOS https://developer....
    Kevin_Junbaozi阅读 4,288评论 0 15
  • 一. Hit-Testing 什么是Hit-Testing?对于触摸事件, window首先会尝试将事件交给事件触...
    面糊阅读 790评论 0 50