iOS中的事件傳遞和響應者鏈條

首先我們來看看iOS中事件的產(chǎn)生和傳遞過程:

1.發(fā)生觸摸事件后话瞧,系統(tǒng)會將該事件加入到一個由UIApplication管理的隊列事件中

2.UIApplication會從事件隊列中取出最前面的事件抄瓦,并將事件分發(fā)下去以便處理剩彬,通常會先發(fā)送事件給應用程序的主窗口(keyWindow)

3.主窗口會在視圖層次結構中找到一個最合適的視圖來處理觸摸事件

4.找到合適的視圖控件后赫悄,就會調用視圖控件的touches方法來作事件的具體處理:touchesBegin... touchesMoved...touchesEnded等

5.這些touches方法默認的做法是將事件順著響應者鏈條向上傳遞,將事件叫個上一個相應者進行處理

下面我們舉個例子來演示下具體的傳遞過程眶根,如圖:

一般事件的傳遞是從父控件傳遞到子控件的

例如:點擊了綠色的View比藻,傳遞過程如下:UIApplication->Window->白色View->綠色View

點擊藍色的View,傳遞過程如下:UIApplication->Window->白色View->橙色View->藍色View

如果父控件接受不到觸摸事件贡这,那么子控件就不可能接收到觸摸事件

UIView不能接收觸摸事件的三種情況:

1.不接受用戶交互:userInteractionEnabled = NO;

2.隱藏:hidden = YES;

3.透明:alpha = 0.0~0.01

如何找到最合適的控件來處理事件呢茬末?有以下準則

1.自己是否能接受觸摸事件

2.觸摸點是否在自己身上

3.從后往前遍歷子控件,重復上面的兩個步驟

4.如果沒有符合條件的子控件,那么自己最適合處理

例如:

說明一下控件的添加順序:白1->綠2->橙2->藍3->紅3->黃4

這里點擊了橙色的那塊區(qū)域丽惭,事件傳遞判斷過程如下:

1.UIApplication從事件隊列中取出事件分發(fā)給UIWindow

2.UIWindow判斷自己是否能接受觸摸事件击奶,可以

3.UIWindow判斷觸摸點是否在自己身上,是的责掏。

4.UIWindow從后往前便利自己的子控件柜砾,取出白1

5.白1都滿足最上面兩個條件,遍歷子控件橙2

6.橙2都滿足最上面兩個條件换衬,遍歷子控件痰驱,先取出紅3

7.紅3不滿足條件2,取出藍3

8.藍3也不滿足條件2冗疮,最后最合適的控件是橙2

找到合適的控件之后就要進行響應了萄唇,這里先介紹一下響應者鏈條:響應者鏈條其實就是很多響應者對象(繼承自UIResponder的對象)一起組合起來的鏈條稱之為響應者鏈條

一般默認做法是控件將事件順著響應者鏈條向上傳遞檩帐,將事件交給上一個響應者進行處理术幔。那么如何判斷當前響應者的上一個響應者是誰呢?有以下兩個規(guī)則:

1.判斷當前是否是控制器的View湃密,如果是控制器的View诅挑,上一個響應者就是控制器

2.如果不是控制器的View,上一個響應者就是父控件

響應過程如下圖:

如果控制器也不響應響應touches方法泛源,就交給UIWindow拔妥。如果UIWindow也不響應,交給UIApplication达箍,如果都不響應事件就作廢了没龙。

最后總結來說一次完整的觸摸事件的傳遞響應過程為:

UIApplication-->UIWindow-->遞歸找到最合適處理的控件-->控件調用touches方法-->判斷是否實現(xiàn)touches方法-->沒有實現(xiàn)默認會將事件傳遞給上一個響應者-->找到上一個響應者-->找不到方法作廢

PS:利用響應者鏈條我們可以通過調用touches的super 方法,讓多個響應者同時響應該事件缎玫。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末硬纤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子赃磨,更是在濱河造成了極大的恐慌筝家,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邻辉,死亡現(xiàn)場離奇詭異溪王,居然都是意外死亡,警方通過查閱死者的電腦和手機值骇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門莹菱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吱瘩,你說我怎么就攤上這事芒珠。” “怎么了搅裙?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵皱卓,是天一觀的道長裹芝。 經(jīng)常有香客問我,道長娜汁,這世上最難降的妖魔是什么嫂易? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮掐禁,結果婚禮上怜械,老公的妹妹穿的比我還像新娘。我一直安慰自己傅事,他們只是感情好缕允,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蹭越,像睡著了一般障本。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上响鹃,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天驾霜,我揣著相機與錄音,去河邊找鬼买置。 笑死粪糙,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的忿项。 我是一名探鬼主播蓉冈,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼轩触!你這毒婦竟也來了寞酿?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤怕膛,失蹤者是張志新(化名)和其女友劉穎熟嫩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體褐捻,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡掸茅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了柠逞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昧狮。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖板壮,靈堂內(nèi)的尸體忽然破棺而出逗鸣,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布撒璧,位于F島的核電站透葛,受9級特大地震影響,放射性物質發(fā)生泄漏卿樱。R本人自食惡果不足惜僚害,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望繁调。 院中可真熱鬧萨蚕,春花似錦、人聲如沸蹄胰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裕寨。三九已至浩蓉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間帮坚,已是汗流浹背妻往。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工互艾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留试和,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓纫普,卻偏偏與公主長得像阅悍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子昨稼,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

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