響應者鏈

一娇斑、響應者對象

App使用響應者對象來處理觸摸事件。響應者對象的類是UIResponder材部,所有繼承于UIResponder的子類的實例都是響應者對象毫缆。這些子類包括常見的UIView、UIViewController乐导、UIWindow苦丁、UIApplication等。

二物臂、查找第一響應者

用戶觸摸屏幕后旺拉,系統(tǒng)會將觸摸事件封裝成一個UIEvent對象發(fā)送給UIApplication對象产上。UIApplication會將UIEvent對象加入到事件隊列中。UIApplication事件隊列遵循先進先出的原則蛾狗,會將隊列最前面的事件取出來發(fā)送給UIWindow晋涣。

然而并不是所有UIResponder對象都能成為響應者,如果UIResponder對象出現(xiàn)以下幾種情況沉桌,則不能響應事件:
1谢鹊、userInteractionEnabled == NO;
2、hidden == YES;
3留凭、alpha <= 0.01;
4佃扼、調(diào)用pointInside:point withEvent:event方法返回NO

UIWindow接收到觸摸事件后, 會通過hitTest:withEvent:方法查找第一響應者蔼夜,該方法會返回第一響應者兼耀,查找過程如下:
1、判斷自身是否能響應事件(方法在上面)挎扰,如果不能,則hitTest:withEvent:方法返回nil巢音,此視圖不能響應事件遵倦。
2、如果可以響應事件官撼,則會從后向前遍歷子控件梧躺,子控件也會調(diào)用hitTest:withEvent:查找他的視圖層級中的第一響應者。
3傲绣、如果有子視圖可以響應事件掠哥,則返回子視圖,如果沒有秃诵,則返回自身续搀。

hitTest:withEvent:方法的內(nèi)部實現(xiàn)大概是這樣的

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
    
    BOOL isHit = [self isPossibleResponder:point withEvent:event];
    
    if (isHit == NO) return nil;
    
    for (int i = self.subviews.count - 1;i >= 0;i--) {
        
        UIView *subView = self.subviews[i];
        UIView *hitTestView = [subView hitTest:point withEvent:event];
        
        if (hitTestView) return hitTestView;
    }
    
    return self;
}

- (BOOL)isPossibleFirstResponder:(CGPoint)point withEvent:(UIEvent *)event{
    
    if (self.userInteractionEnabled == NO||
        self.hidden == YES||
        self.alpha <= 0.01) return NO;
    
    return [self pointInside:point withEvent:event];
}

當然,你也可以通過重寫這個方法返回你所指定的響應者對象菠净。

三禁舷、響應者鏈

系統(tǒng)通過上面的方法可以查找到第一響應者,但第一響應者只是可以響應事件毅往,并不代表它一定會響應這個事件牵咙。如果第一響應者不響應事件,它會把事件沿著響應者鏈向上傳遞攀唯。
533143-65412f6cba1f0b56.png

響應者對象有一個屬性nextResponder洁桌,即當前響應者對象在響應者鏈上的下一環(huán),在當前響應者對象不響應事件的情況下侯嘀,系統(tǒng)會將事件傳遞給nextResponder另凌。你可以重寫get方法返回指定的nextResponder谱轨。如果不重寫,系統(tǒng)會默認指定了一些響應者對象的nextResponder

  • UIView:如果View是控制器的主View途茫,則nextResponder就是控制器碟嘴。否則,nextResponder是View的superView囊卜。
  • UIViewController:
    • 如果UIViewController是UIWindow的根控制器娜扇,那么它的nextResponder是Window;
    • 如果UIViewController是通過presentViewController方法彈出來的栅组,那么它的nextResponder是彈它出來的那個控制器雀瓢;
    • 如果不是以上兩種情況,那么它的nextResponder是它的主View的superView玉掸。
  • UIWindow:nextResponder是UIApplication對象刃麸。
  • UIApplication:如果app delegate對象是響應者對象,且不是UIView司浪、UIViewController或者UIApplication本身泊业,那么UIApplication的nextResponder是app delegate。

如果事件沿著響應者鏈傳遞到UIApplication或者app delegate都沒有響應者對象響應啊易,那么這個事件就會被丟棄吁伺。

四、手勢

UIView的手勢的響應優(yōu)先級高于UIView本身租谈。UIView收到UIEvent后篮奄,會優(yōu)先交給綁定到它身上的手勢進行識別,如果識別不出來割去,才會交由UIView響應窟却。如果UIView不響應,則會沿著響應者鏈向上傳遞呻逆。

五夸赫、參考文章

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市咖城,隨后出現(xiàn)的幾起案子憔足,更是在濱河造成了極大的恐慌,老刑警劉巖酒繁,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滓彰,死亡現(xiàn)場離奇詭異,居然都是意外死亡州袒,警方通過查閱死者的電腦和手機揭绑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人他匪,你說我怎么就攤上這事菇存。” “怎么了邦蜜?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵依鸥,是天一觀的道長。 經(jīng)常有香客問我悼沈,道長贱迟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任絮供,我火速辦了婚禮衣吠,結果婚禮上,老公的妹妹穿的比我還像新娘壤靶。我一直安慰自己缚俏,他們只是感情好,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布贮乳。 她就那樣靜靜地躺著忧换,像睡著了一般。 火紅的嫁衣襯著肌膚如雪向拆。 梳的紋絲不亂的頭發(fā)上亚茬,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天,我揣著相機與錄音亲铡,去河邊找鬼才写。 笑死葡兑,一個胖子當著我的面吹牛奖蔓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播讹堤,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼吆鹤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了洲守?” 一聲冷哼從身側(cè)響起疑务,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梗醇,沒想到半個月后知允,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡叙谨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年温鸽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡涤垫,死狀恐怖姑尺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蝠猬,我是刑警寧澤切蟋,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站榆芦,受9級特大地震影響柄粹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜歧杏,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一镰惦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧犬绒,春花似錦旺入、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至咐鹤,卻和暖如春拗秘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背祈惶。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工雕旨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捧请。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓凡涩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疹蛉。 傳聞我的和親對象是個殘疾皇子活箕,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349