iOS 響應者鏈(Responder Chain)

終于搞清楚iOS響應者鏈了

首先要清楚幾個關(guān)鍵字:UIResponderFirst responder

UIResponder是所有響應對象的基類恶耽,在UIResponder類中定義了處理各種事件的接口。我們熟悉的UIApplication批什、 UIViewController社搅、UIWindow和所有繼承自UIView的UIKit類都繼承自UIResponder,所以它們的實例都是可以構(gòu)成響應者鏈的響應者對象形葬。

First responder(第一響應者)指的是當前接受觸摸的響應者對象(通常是一個UIView對象),即表示當前該對象正在與用戶交互淌实,它是響應者鏈的開端猖腕。整個響應者鏈和事件分發(fā)的使命都是找出第一響應者。

大概過程:

1.Events 發(fā)生
2.hitTest:withEvent:pointInside:withEvent: 查找第一響應者
3.向上傳遞事件

發(fā)生事件 -- 查找事件源 -- 處理事件 大概這么個邏輯

iOS系統(tǒng)檢測到手指觸摸(Touch)操作時會將其打包成一個UIEvent對象放坏,并放入當前活動Application的事件隊列老玛,單例的UIApplication會從事件隊列中取出觸摸事件并傳遞給UIWindow來處理,

UIWindow首先會使用hitTest:withEvent:方法尋找此次Touch事件初始點所在的View蜡豹。尋找的方法就是,從window開始弄诲,遍歷所有的子控件的hitTest:withEvent:方法娇唯,直到找到或者全部遍歷完成為止凤巨。
具體可以查看這個函數(shù)的說明

找到First responder后洛搀,運行循環(huán)runLoop(這里可以忽略留美,就知道有個對象干了一件事情就行了)以消息的形式將事件發(fā)送給第一響應者(調(diào)用touch方法)伸刃,使其有機會首先處理事件。如果第一響應者沒有進行處理(沒實現(xiàn)touch方法)捧颅,系統(tǒng)就將事件傳遞給響應者鏈中的下一個響應者(父節(jié)點,父控件)挚币,看看它是否可以進行處理扣典。直到UIApplication,都沒人處理贮尖,就會被丟棄。官方的說法:事件分發(fā)(Event Delivery)

具體的介紹

- ([UIView]hitTest:([CGPoint]point withEvent:([UIEvent] *)event;

不難看懂就不翻譯了薪前,主要是自己回顧使用关斜,如果有其他人看了,實在看不了英文的蚤吹,找個翻譯軟件也行了

Returns the farthest descendant of the receiver in the view hierarchy (including itself) that contains a specified point.

This method traverses the view hierarchy by calling the [pointInside:withEvent:] method of each subview to determine which subview should receive a touch event. If [pointInside:withEvent:]returns YES, then the subview’s hierarchy is similarly traversed until the frontmost view containing the specified point is found. If a view does not contain the point, its branch of the view hierarchy is ignored. You rarely need to call this method yourself, but you might override it to hide touch events from subviews.

This method ignores view objects that are hidden, that have disabled user interactions, or have an alpha level less than 0.01. This method does not take the view’s content into account when determining a hit. Thus, a view can still be returned even if the specified point is in a transparent portion of that view’s content.

Points that lie outside the receiver’s bounds are never reported as hits, even if they actually lie within one of the receiver’s subviews. This can occur if the current view’s [clipsToBounds] property is set to NOand the affected subview extends beyond the view’s bounds.

UIControl繁涂,UITapGesturer

對于UIButton那類,繼承自UIControl的扔罪,還是有一點點的區(qū)別的桶雀。但是查找等方法還是一樣的唬复,都是通過hitTest:withEvent:全肮,只是找到第一響應者后的事件分發(fā)(Event Delivery)變了。之前是直接調(diào)用第一響應者的Touch事件的休建,但是現(xiàn)在找的是注冊的target對象,調(diào)用注冊的selector方法测砂。

對于添加手勢的情況也是一樣的百匆,只是最后事件分發(fā)變了

14870477182709.jpg

參考鏈接:

  1. iOS 響應者鏈 整理
  2. Responder一點也不神秘————iOS用戶響應者鏈完全剖析
    3.響應者鏈機制介紹
    英文版地址:Understanding cocoa and cocoa touch responder chain
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末存璃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子有巧,更是在濱河造成了極大的恐慌悲没,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甜橱,死亡現(xiàn)場離奇詭異栈戳,居然都是意外死亡,警方通過查閱死者的電腦和手機子檀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亩进,“玉大人缩歪,你說我怎么就攤上這事。” “怎么了习贫?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵苫昌,是天一觀的道長。 經(jīng)常有香客問我蜡歹,道長涕烧,這世上最難降的妖魔是什么汗洒? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮瞻凤,結(jié)果婚禮上世杀,老公的妹妹穿的比我還像新娘。我一直安慰自己瞻坝,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布衙荐。 她就那樣靜靜地躺著浮创,像睡著了一般。 火紅的嫁衣襯著肌膚如雪斩披。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天煌抒,我揣著相機與錄音乡话,去河邊找鬼。 笑死,一個胖子當著我的面吹牛屋群,可吹牛的內(nèi)容都是我干的坏挠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼对竣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了否纬?” 一聲冷哼從身側(cè)響起蛋褥,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎膜廊,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爪瓜,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡匙瘪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了算灸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驻啤。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖骑冗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巧涧,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布谤绳,位于F島的核電站,受9級特大地震影響缩筛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瞎抛,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胎撤。 院中可真熱鬧,春花似錦伤提、人聲如沸认烁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稽穆。三九已至,卻和暖如春舌镶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背餐胀。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工瘤载, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸣奔。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像扣汪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子崭别,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 一. Hit-Testing 什么是Hit-Testing?對于觸摸事件, window首先會嘗試將事件交給事件觸...
    面糊閱讀 815評論 0 50
  • 用戶以多種方式操縱他們的iOS設(shè)備茅主,例如觸摸屏幕或搖動設(shè)備。 iOS會解釋用戶何時以及如何操作硬件并將此信息傳遞到...
    坤坤同學閱讀 3,978評論 7 19
  • 好奇觸摸事件是如何從屏幕轉(zhuǎn)移到APP內(nèi)的匀奏?困惑于Cell怎么突然不能點擊了?糾結(jié)于如何實現(xiàn)這個奇葩響應需求娃善?亦或是...
    Lotheve閱讀 56,680評論 51 597
  • 在iOS開發(fā)中經(jīng)常會涉及到觸摸事件瑞佩。本想自己總結(jié)一下,但是遇到了這篇文章炬丸,感覺總結(jié)的已經(jīng)很到位,特此轉(zhuǎn)載稠炬。作者:L...
    WQ_UESTC閱讀 5,989評論 4 26
  • 4事件分發(fā)機制 iOS中的事件大概分為三種,分別是Milti-Touch Events, Motion Event...
    Kevin_Junbaozi閱讀 799評論 0 2