面試復(fù)習(xí)-事件響應(yīng)鏈總結(jié)

首先參考響應(yīng)者鏈條 http://www.reibang.com/p/c294d1bd963d

系統(tǒng)響應(yīng)

  1. 首先 屏幕接收到點(diǎn)擊后在孝,IOKit會(huì)進(jìn)行事件捕捉
  2. 而后通過(guò) mach port傳遞給SpringBoad進(jìn)程
  3. SpringBoard進(jìn)程因接收到觸摸事件继榆,觸發(fā)了主線程runloop的source1事件源的回調(diào)
  4. 如果此時(shí)在桌面,則交給桌面系統(tǒng)去消耗該事件
  5. 如果此時(shí)在app前臺(tái),則通過(guò)IPC(進(jìn)程通信)傳給app進(jìn)程

APP響應(yīng)

  1. 通過(guò) mach port收到SpringBoad的觸摸事件,主線程runloop被喚醒驻仅,觸發(fā)source1回調(diào)
  2. source1回調(diào)觸發(fā)soirce0回調(diào)嬉挡,將觸摸事件封成UIEvent事件
  3. source0將事件添加到UIApplication對(duì)象的隊(duì)列中丰泊,開(kāi)始尋找最佳響應(yīng)者h(yuǎn)it-testing
  4. 尋找到最佳響應(yīng)者后,開(kāi)始事件的響應(yīng)在響應(yīng)鏈中的傳遞和響應(yīng)
  5. 觸摸事件要么被某個(gè)響應(yīng)對(duì)象捕獲后釋放隙轻,要么無(wú)法找到響應(yīng)對(duì)象后釋放

hit-Testing

  1. UIApplication 通過(guò) 調(diào)用UIWindow的 hitTest:withEvent: 傳遞給UIWindow埠帕,依次從后往前遍歷子視圖傳遞
  2. 過(guò)程
    1. 判斷是否可交互
      • 不允許交互:userInteractionEnabled = NO
      • 隱藏:hidden = YES 如果父視圖隱藏,那么子視圖也會(huì)隱藏大脉,隱藏的視圖無(wú)法接收事件
      • 透明度:alpha < 0.01 如果設(shè)置一個(gè)視圖的透明度<0.01搞监,會(huì)直接影響子視圖的透明度。alpha:0.0~0.01為透明镰矿。
    2. 判斷是否在視圖中 if ([self pointInside:point withEvent:event] == NO) return nil;
    3. 判斷是否在子視圖中 CGPoint childP = [self convertPoint:point toView:childView];
      UIView *fitView = [childView hitTest:childP withEvent:event];
    4. 重寫(xiě)父視圖 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 可以實(shí)現(xiàn)超出點(diǎn)擊

事件響應(yīng)

  1. 事件的最佳響應(yīng)者是 hit-tested view琐驴,他可以獨(dú)吞事件 也可以往后傳遞
  2. 不操作默認(rèn)往下分發(fā),通過(guò)nextResponder
  3. 在 touchesMoved: withEvent: 是否調(diào)用父類同名方法決定是否往下分發(fā)

事件優(yōu)先級(jí) UIResponder秤标、UIGestureRecognizer绝淡、UIControl

UIResponder 和 UIGestureRecognizer

  1. 如果成功識(shí)別了 UIGestureRecognizer 則 優(yōu)先進(jìn)行 手勢(shì),而中止 hit-tested view的 UIResponder 過(guò)程苍姜。
  2. 觸摸狀態(tài)變化 的 begin 先發(fā)送到 手勢(shì) 再 hit-tested
  3. 順序?yàn)?手勢(shì)begin —— hit-test begin—— 手勢(shì)識(shí)別成功——手勢(shì)end ——hit-test cancel
  4. 屬性:cancelsTouchesInView 牢酵。默認(rèn)YES,代表手勢(shì)成功后衙猪,屏蔽響應(yīng)鏈的響應(yīng)
  5. 屬性:delaysTouchesBegan 馍乙。默認(rèn)NO,代表在手勢(shì)識(shí)別期間不會(huì)調(diào)用 hit-test begin垫释,move等
  6. 屬性:delaysTouchesEnded 丝格。默認(rèn)YES,代表手勢(shì)失敗后棵譬,會(huì)延遲0.15s調(diào)用響應(yīng)者的 touchesEnded:withEvent:显蝌,若NO,立即調(diào)用

UIControl

- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(nullable UIEvent *)event;
- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(nullable UIEvent *)event;
- (void)endTrackingWithTouch:(nullable UITouch *)touch withEvent:(nullable UIEvent *)event;
- (void)cancelTrackingWithEvent:(nullable UIEvent *)event;

這幾個(gè)方法是在 touch 系列里面調(diào)用的

  1. UIControl會(huì)阻止父視圖上的手勢(shì)識(shí)別器行為订咸,也就是UIControl處理事件的優(yōu)先級(jí)比UIGestureRecognizer高曼尊,但前提是相比于父視圖上的手勢(shì)識(shí)別器。
  2. UIControl比其父視圖上的手勢(shì)識(shí)別器具有更高的事件響應(yīng)優(yōu)先級(jí)脏嚷。
  3. 準(zhǔn)確地說(shuō)只適用于系統(tǒng)提供的有默認(rèn)action操作的UIControl骆撇,例如UIbutton、UISwitch等的單擊

UIResponser
一:響應(yīng)者鏈 UIResponser包括了各種Touch message 的處理然眼,比如開(kāi)始艾船,移動(dòng)葵腹,停止等等。常見(jiàn)的 UIResponser 有 UIView及子類屿岂,UIViController,APPDelegate践宴,UIApplication等等。
回到響應(yīng)鏈爷怀,響應(yīng)鏈?zhǔn)怯蒛IResponser組成的阻肩,那么是按照哪種規(guī)則形成的。

A: 程序啟動(dòng) UIApplication會(huì)生成一個(gè)單例运授,并會(huì)關(guān)聯(lián)一個(gè)APPDelegate烤惊。APPDelegate作為整個(gè)響應(yīng)鏈的根建立起來(lái),而``UIApplication會(huì)將自己與這個(gè)單例鏈接吁朦,即UIApplication的nextResponser(下一個(gè)事件處理者)為APPDelegate`柒室。

B:創(chuàng)建UIWindow 程序啟動(dòng)后,任何的UIWindow被創(chuàng)建時(shí)逗宜,UIWindow內(nèi)部都會(huì)把nextResponser設(shè)置為UIApplication單例雄右。UIWindow初始化rootViewController,rootViewController的nextResponser會(huì)設(shè)置為UIWindow

C:UIViewController初始化 loadView, VC的view的nextResponser會(huì)被設(shè)置為VC.

D:addSubView addSubView操作過(guò)程中,如果子subView不是VC的View,那么subView的nextResponser會(huì)被設(shè)置為superView纺讲。如果是VC的View,那就是 subView -> subView.VC ->superView如果在中途擂仍,subView.VC被釋放,就會(huì)變成subView.nextResponser = superView

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末熬甚,一起剝皮案震驚了整個(gè)濱河市逢渔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乡括,老刑警劉巖肃廓,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異诲泌,居然都是意外死亡亿昏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)档礁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人吝沫,你說(shuō)我怎么就攤上這事呻澜。” “怎么了惨险?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵羹幸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我辫愉,道長(zhǎng)栅受,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮屏镊,結(jié)果婚禮上依疼,老公的妹妹穿的比我還像新娘。我一直安慰自己而芥,他們只是感情好律罢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著棍丐,像睡著了一般误辑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上歌逢,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天巾钉,我揣著相機(jī)與錄音,去河邊找鬼秘案。 笑死砰苍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的踏烙。 我是一名探鬼主播师骗,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼讨惩!你這毒婦竟也來(lái)了辟癌?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤荐捻,失蹤者是張志新(化名)和其女友劉穎黍少,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體处面,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厂置,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了魂角。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昵济。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖野揪,靈堂內(nèi)的尸體忽然破棺而出访忿,到底是詐尸還是另有隱情,我是刑警寧澤斯稳,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布海铆,位于F島的核電站,受9級(jí)特大地震影響挣惰,放射性物質(zhì)發(fā)生泄漏卧斟。R本人自食惡果不足惜殴边,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望珍语。 院中可真熱鬧锤岸,春花似錦、人聲如沸廊酣。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)亡驰。三九已至晓猛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凡辱,已是汗流浹背戒职。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留透乾,地道東北人洪燥。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像乳乌,于是被迫代替她去往敵國(guó)和親捧韵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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