11. iOS中響應(yīng)者鏈

題記:只要努力,凡事總會(huì)有轉(zhuǎn)機(jī)抱慌。今天復(fù)習(xí)的時(shí)iOS中的響應(yīng)者鏈條和事件的分發(fā),二者存在一定的聯(lián)系眨猎,理解一下原理抑进,對以后編程開發(fā)都會(huì)有幫助的,這些并不難理解睡陪,關(guān)鍵是理解之后要記得住寺渗。

1.什么是事件的響應(yīng)者

只要繼承了UIResponder的對象就可以作為事件的響應(yīng)者,下面看一下 UIResponder及其子類的繼承關(guān)系:

`UIResponder`及其子類的繼承關(guān)系

其中AppDelegate類是創(chuàng)建一個(gè)iOS項(xiàng)目時(shí)自動(dòng)創(chuàng)建的繼承UIResponder的應(yīng)用程序委托類兰迫,記得不太清的同學(xué)可以簡單看一下面的代碼:

// 接口文件
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end

// 實(shí)現(xiàn)文件
#import "AppDelegate.h"
@interface AppDelegate ()
@end

@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application {}
- (void)applicationDidEnterBackground:(UIApplication *)application {}
- (void)applicationWillEnterForeground:(UIApplication *)application {}
- (void)applicationDidBecomeActive:(UIApplication *)application {}
- (void)applicationWillTerminate:(UIApplication *)application {}
@end

2. 什么是第一響應(yīng)者

與用戶交互的控件就是第一響應(yīng)者信殊,它將作為響應(yīng)者鏈的開始,事件首先發(fā)送給第一響應(yīng)者汁果,然后再依次傳遞下去涡拘,直到該事件被某個(gè)響應(yīng)者處理。

3. 響應(yīng)者鏈

如果當(dāng)前響應(yīng)者無法響應(yīng)用戶事件据德,它將繼續(xù)向上傳遞鳄乏,直到找到該響應(yīng)者,這個(gè)傳遞過程形成了一條有規(guī)律的鏈條棘利,組成了響應(yīng)者鏈橱野,如下圖:

響應(yīng)者鏈的組成

如果一直找到AppDelegate類還是無法響應(yīng)用戶事件,那么這個(gè)事件將無法被響應(yīng)善玫,但如果在響應(yīng)者鏈上傳遞的過程中水援,有某個(gè)響應(yīng)者對該傳遞的事件有響應(yīng),該傳遞過程將立即停止蝌焚。

4. 事件分發(fā)
  • 當(dāng)一個(gè)觸摸事件發(fā)生裹唆,首先接收到事件的對象是UIApplication
  • 將事件放入U(xiǎn)IApplication的活動(dòng)隊(duì)列中
  • UIApplication的單例對象,再從活動(dòng)隊(duì)列取出該事件只洒,并傳遞給UIWindow
  • UIWindow的對象將調(diào)用-(nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event;方法
    • 在這個(gè)方法中對其下一層的每一個(gè)視圖調(diào)用- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event;方法许帐,用于判斷當(dāng)前點(diǎn)擊的點(diǎn)是否位于當(dāng)前視圖中

      (1)若返回NO,則表示不在當(dāng)前視圖中毕谴,-(nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event;方法返回nil;

      (2)若返回YES成畦,則說明該觸摸事件發(fā)生在當(dāng)前視圖,然后當(dāng)前視圖再調(diào)用 -(nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event;方法;

      (3)重復(fù)上述過程涝开,直到- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event;方法返回YES循帐,并使用它調(diào)用-(nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event;方法返回nil的時(shí)候,表示此視圖就是這個(gè)觸摸事的第一響應(yīng)者舀武。

5.導(dǎo)致響應(yīng)者鏈條斷掉的幾種可能

  • 不能響應(yīng)觸摸事件 userInteractionEnable = NO;
  • 這個(gè)要響應(yīng)事件的視圖被隱藏掉了拄养,一種是hidden屬性設(shè)置為 YES了,另一種是這個(gè)圖層的透明度alpha被設(shè)置為 0-0.1之間的值(0.1是我在模擬器中試出來的值);
  • 要響應(yīng)事件的視圖被其他視圖B遮住了银舱,相信這個(gè)一般很容易被發(fā)現(xiàn)瘪匿,需要說明的是當(dāng)這個(gè)其他視圖B的透明度在0-0.1之間的時(shí)候跛梗,這個(gè)響應(yīng)時(shí)間還是可以傳遞到“要響應(yīng)事件的視圖”上去的,所以當(dāng)“要響應(yīng)事件的視圖”未響應(yīng)你設(shè)定的響應(yīng)事件棋弥,檢查一下是否有這樣的一個(gè)視圖B覆蓋在上面核偿,且它的透明度大于0.1;

這里要感謝 紙飛機(jī)波音747的提問顽染,和iPhone貼膜小哥對回答的補(bǔ)充

參考博文

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漾岳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子粉寞,更是在濱河造成了極大的恐慌尼荆,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仁锯,死亡現(xiàn)場離奇詭異耀找,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)业崖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門野芒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人双炕,你說我怎么就攤上這事狞悲。” “怎么了妇斤?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵摇锋,是天一觀的道長。 經(jīng)常有香客問我站超,道長荸恕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任死相,我火速辦了婚禮融求,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘算撮。我一直安慰自己生宛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布肮柜。 她就那樣靜靜地躺著陷舅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪审洞。 梳的紋絲不亂的頭發(fā)上莱睁,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼仰剿。 笑死耙箍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的酥馍。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼阅酪,長吁一口氣:“原來是場噩夢啊……” “哼秧了!你這毒婦竟也來了秘遏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎储矩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禽绪,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闸度,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瑞躺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敷搪。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖幢哨,靈堂內(nèi)的尸體忽然破棺而出赡勘,到底是詐尸還是另有隱情,我是刑警寧澤捞镰,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布闸与,位于F島的核電站,受9級(jí)特大地震影響岸售,放射性物質(zhì)發(fā)生泄漏践樱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一凸丸、第九天 我趴在偏房一處隱蔽的房頂上張望拷邢。 院中可真熱鬧,春花似錦甲雅、人聲如沸解孙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弛姜。三九已至,卻和暖如春妖枚,著一層夾襖步出監(jiān)牢的瞬間廷臼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荠商,地道東北人寂恬。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像莱没,于是被迫代替她去往敵國和親初肉。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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