iOS 事件傳遞機(jī)制和響應(yīng)者鏈條

iOS中加載的時(shí)候會先執(zhí)行main函數(shù)

int main(int argc, charchar * argv[]) {

@autoreleasepool {

return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

}

}

根據(jù)main函數(shù)的參數(shù)加載UIApplication->AppDelegate->UIWindow->UIViewController->superView->subViews

關(guān)系為:UIApplication.keyWindow.rootViewController.view.subView

事件傳遞機(jī)制:

1.當(dāng)iOS程序中發(fā)生觸摸事件后纱昧,系統(tǒng)會將事件加入到UIApplication管理的一個(gè)任務(wù)隊(duì)列中

2.UIApplication將處于任務(wù)隊(duì)列最前端的事件向下分發(fā)安疗。即UIWindow鞭衩。

3.UIWindow將事件向下分發(fā)收恢,即UIView宫蛆。

4.UIView首先看自己是否能處理事件唾琼,觸摸點(diǎn)是否在自己身上痘系。如果能妇穴,那么繼續(xù)尋找子視圖灸姊。

5.遍歷子控件拱燃,重復(fù)以上兩步。

6.如果沒有找到力惯,那么自己就是事件處理者碗誉。如果

7.如果自己不能處理召嘶,那么不做任何處理。

其中 UIView不接受事件處理的情況主要有以下三種

1)alpha <0.01

2)userInteractionEnabled = NO

3.hidden = YES


以下來自網(wǎng)絡(luò):

響應(yīng)者鏈條概念: iOS系統(tǒng)檢測到手指觸摸(Touch)操作時(shí)會將其打包成一個(gè)UIEvent對象哮缺,并放入當(dāng)前活動Application的事件隊(duì)列弄跌,單例的UIApplication會從事件隊(duì)列中取出觸摸事件并傳遞給單例的UIWindow來處理,UIWindow對象首先會使用hitTest:withEvent:方法尋找此次Touch操作初始點(diǎn)所在的視圖(View)尝苇,即需要將觸摸事件傳遞給其處理的視圖铛只,這個(gè)過程稱之為hit-test view。

UIResponder 是所有響應(yīng)對象的基類糠溜,在UIResponder類中定義了處理上述各種事件的接口淳玩。我們熟悉的 UIApplication、 UIViewController非竿、 UIWindow 和所有繼承自UIView的UIKit類都直接或間接的繼承自UIResponder蜕着,所以它們的實(shí)例都是可以構(gòu)成響應(yīng)者鏈的響應(yīng)者對象。

UIWindow實(shí)例對象會首先在它的內(nèi)容視圖上調(diào)用hitTest:withEvent:红柱,此方法會在其視圖層級結(jié)構(gòu)中的每個(gè)視圖上調(diào)用pointInside:withEvent:(該方法用來判斷點(diǎn)擊事件發(fā)生的位置是否處于當(dāng)前視圖范圍內(nèi)承匣,以確定用戶是不是點(diǎn)擊了當(dāng)前視圖),如果pointInside:withEvent:返回YES锤悄,則繼續(xù)逐級調(diào)用韧骗,直到找到touch操作發(fā)生的位置,這個(gè)視圖也就是要找的hit-test view零聚。

hitTest:withEvent:方法的處理流程如下:

首先調(diào)用當(dāng)前視圖的pointInside:withEvent:方法判斷觸摸點(diǎn)是否在當(dāng)前視圖內(nèi)袍暴;

若返回NO,則hitTest:withEvent:返回nil;

若返回YES,則向當(dāng)前視圖的所有子視圖(subviews)發(fā)送hitTest:withEvent:消息,所有子視圖的遍歷順序是從最頂層視圖一直到到最底層視圖握牧,即從subviews數(shù)組的末尾向前遍歷容诬,直到有子視圖返回非空對象或者全部子視圖遍歷完畢;

若第一次有子視圖返回非空對象沿腰,則hitTest:withEvent:方法返回此對象览徒,處理結(jié)束;

如所有子視圖都返回非颂龙,則hitTest:withEvent:方法返回自身(self)习蓬。

一次完整的觸摸事件的傳遞響應(yīng)的過程

UIApplication --> UIWindow --> 遞歸找到最適合處理事件的控件

控件調(diào)用touches方法 --> 判斷是否實(shí)現(xiàn)touches方法 --> 沒有實(shí)現(xiàn)默認(rèn)會將事件傳遞給上一個(gè)響應(yīng)者 --> 找到上一個(gè)響應(yīng)者

PS:如果直到UIApplication都不響應(yīng),那么這個(gè)事件就被廢棄了措嵌。

1.響應(yīng)者鏈條:由很多響應(yīng)者鏈接在一起組合起來的一個(gè)鏈條

響應(yīng)者:繼承自UIResponder的對象稱之為響應(yīng)者對象

2.上一個(gè)響應(yīng)者(默認(rèn)做法是將事件順著響應(yīng)者鏈條向上傳遞躲叼,將事件交給上一個(gè)響應(yīng)者進(jìn)行處理)

如何判斷當(dāng)前響應(yīng)者的上一個(gè)響應(yīng)者是誰?

1>判斷當(dāng)前是否是控制器的View企巢,如果是枫慷,上一個(gè)響應(yīng)者就是控制器

2>如果當(dāng)前不是控制器的View,上一個(gè)響應(yīng)者就是父控件

3.響應(yīng)者鏈條有什么用?

可以讓一個(gè)觸摸事件發(fā)聲的時(shí)候讓多個(gè)響應(yīng)者同時(shí)響應(yīng)該事件

在子類的實(shí)現(xiàn)文件里的touchesBegan:方法里加上如下代碼即可

[super touchesBegan:touches withEvent:event]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末或听,一起剝皮案震驚了整個(gè)濱河市探孝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌誉裆,老刑警劉巖顿颅,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異足丢,居然都是意外死亡粱腻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進(jìn)店門斩跌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绍些,“玉大人,你說我怎么就攤上這事耀鸦∮龈铮” “怎么了?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵揭糕,是天一觀的道長。 經(jīng)常有香客問我锻霎,道長著角,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任旋恼,我火速辦了婚禮吏口,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘冰更。我一直安慰自己产徊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布蜀细。 她就那樣靜靜地躺著舟铜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奠衔。 梳的紋絲不亂的頭發(fā)上谆刨,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天,我揣著相機(jī)與錄音归斤,去河邊找鬼痊夭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛脏里,可吹牛的內(nèi)容都是我干的她我。 我是一名探鬼主播,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼番舆!你這毒婦竟也來了酝碳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤合蔽,失蹤者是張志新(化名)和其女友劉穎击敌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拴事,經(jīng)...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沃斤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刃宵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衡瓶。...
    茶點(diǎn)故事閱讀 38,697評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖牲证,靈堂內(nèi)的尸體忽然破棺而出哮针,到底是詐尸還是另有隱情,我是刑警寧澤坦袍,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布十厢,位于F島的核電站,受9級特大地震影響捂齐,放射性物質(zhì)發(fā)生泄漏蛮放。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一奠宜、第九天 我趴在偏房一處隱蔽的房頂上張望包颁。 院中可真熱鬧,春花似錦压真、人聲如沸娩嚼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岳悟。三九已至,卻和暖如春嘴高,著一層夾襖步出監(jiān)牢的瞬間竿音,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工拴驮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留春瞬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓套啤,卻偏偏與公主長得像宽气,于是被迫代替她去往敵國和親随常。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評論 2 350

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