【code_hyy_基礎(chǔ)】事件傳遞鏈/事件響應(yīng)鏈

一.事件傳遞鏈

當(dāng)點(diǎn)擊一個(gè)按鈕的時(shí)候娱颊,事件如果傳遞到按鈕這個(gè)第一響應(yīng)者上拦耐,這就是事件傳遞鏈要做的事情弯蚜。系統(tǒng)根據(jù)下面兩個(gè)方法來(lái)傳遞事件十籍。

//該點(diǎn)是否在本視圖點(diǎn)擊范圍內(nèi) point已經(jīng)被轉(zhuǎn)換了成本視圖對(duì)應(yīng)frame- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {    //內(nèi)部實(shí)現(xiàn)大概是這樣
    return CGRectContainsPoint(self.bounds, point);
}//本視圖/子視圖是否能夠傳遞本事件 point已經(jīng)被轉(zhuǎn)換了成本視圖對(duì)應(yīng)frame- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {    //內(nèi)部實(shí)現(xiàn)大概是這樣
    //用戶交互為NO,不處理
    if(self.userInteractionEnabled == NO) {        return nil;
    }    if([self pointInside:point withEvent:event]) {        NSArray * superViews = self.subviews;        //倒序從最上面的一個(gè)視圖開始查找
        for (NSUInteger i = superViews.count; i > 0; i--) {            UIView * subview = superViews[i - 1];            //轉(zhuǎn)換坐標(biāo)系 使坐標(biāo)基于子視圖
            CGPoint newPoint = [self convertPoint:point toView:subview];            //得到子視圖 hitTest 方法返回的值
            UIView * view = [subview hitTest:newPoint withEvent:event];            //如果子視圖返回一個(gè)view 就直接返回 不在繼續(xù)遍歷
            if (view) {                return view;
            }
        }        //所有子視圖都沒(méi)有返回 則返回自身
        return self;
    }    return nil;
}

當(dāng)點(diǎn)擊按鈕的時(shí)候唇礁,其實(shí)事件是這樣傳遞的:AppDelegate->UIApplication->UIWindow->xxx->UIViewController->UIView->UIButton勾栗。

二.事件響應(yīng)鏈

當(dāng)找到事件第一響應(yīng)者之后,該事件如何響應(yīng)盏筐,就是事件響應(yīng)鏈要做的事情围俘。
接著上面的例子,UIButton就是系統(tǒng)找出來(lái)的第一響應(yīng)者,那么會(huì)執(zhí)行如下方法:

//觸摸事件開始- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {}//觸摸事件移動(dòng)- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {}//觸摸事件結(jié)束- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {}//觸摸事件取消- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {}
如果你自己不處理界牡,你可以self.nextResponder讓下一個(gè)響應(yīng)者處理簿寂。

//觸摸事件開始- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {    //讓下一個(gè)響應(yīng)者處理
    [self.nextResponder touchesBegan:touches withEvent:event];
}

響應(yīng)者鏈也就是傳遞鏈的倒序。

  • 這里需要注意的就是宿亡,如果給UIButton添加了target和UITapGestureRecognizer那么點(diǎn)擊按鈕只會(huì)執(zhí)行UITapGestureRecognizer常遂,也就是說(shuō)如果手勢(shì)和target同時(shí)滿足條件則只會(huì)執(zhí)行手勢(shì)。target也是touchesxxx中判定的挽荠,你可以重寫touchesxxx內(nèi)部實(shí)現(xiàn)為空克胳,你會(huì)發(fā)現(xiàn)并不影響手勢(shì)但會(huì)影響target。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末圈匆,一起剝皮案震驚了整個(gè)濱河市漠另,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌跃赚,老刑警劉巖笆搓,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異纬傲,居然都是意外死亡满败,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門嘹锁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)葫录,“玉大人,你說(shuō)我怎么就攤上這事领猾∶淄” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵摔竿,是天一觀的道長(zhǎng)面粮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)继低,這世上最難降的妖魔是什么熬苍? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮袁翁,結(jié)果婚禮上柴底,老公的妹妹穿的比我還像新娘。我一直安慰自己粱胜,他們只是感情好柄驻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著焙压,像睡著了一般鸿脓。 火紅的嫁衣襯著肌膚如雪抑钟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天野哭,我揣著相機(jī)與錄音在塔,去河邊找鬼。 笑死拨黔,一個(gè)胖子當(dāng)著我的面吹牛蛔溃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蓉驹,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼城榛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了态兴?” 一聲冷哼從身側(cè)響起狠持,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞻润,沒(méi)想到半個(gè)月后喘垂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绍撞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年正勒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片傻铣。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡章贞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出非洲,到底是詐尸還是另有隱情鸭限,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布两踏,位于F島的核電站败京,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏梦染。R本人自食惡果不足惜赡麦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帕识。 院中可真熱鬧泛粹,春花似錦、人聲如沸晶姊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)帽借。三九已至,卻和暖如春超歌,著一層夾襖步出監(jiān)牢的瞬間砍艾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工巍举, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脆荷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓懊悯,卻偏偏與公主長(zhǎng)得像蜓谋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子炭分,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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

  • 好奇觸摸事件是如何從屏幕轉(zhuǎn)移到APP內(nèi)的桃焕?困惑于Cell怎么突然不能點(diǎn)擊了?糾結(jié)于如何實(shí)現(xiàn)這個(gè)奇葩響應(yīng)需求捧毛?亦或是...
    Lotheve閱讀 57,147評(píng)論 51 599
  • 本文主要講解iOS觸摸事件的一系列機(jī)制观堂,涉及的問(wèn)題大致包括: 觸摸事件由觸屏生成后如何傳遞到當(dāng)前應(yīng)用? 應(yīng)用接收觸...
    baihualinxin閱讀 1,208評(píng)論 0 9
  • 在iOS開發(fā)中經(jīng)常會(huì)涉及到觸摸事件呀忧。本想自己總結(jié)一下师痕,但是遇到了這篇文章,感覺(jué)總結(jié)的已經(jīng)很到位而账,特此轉(zhuǎn)載胰坟。作者:L...
    WQ_UESTC閱讀 6,011評(píng)論 4 26
  • 在開發(fā)過(guò)程中,大家或多或少的都會(huì)碰到令人頭疼的手勢(shì)沖突問(wèn)題泞辐,正好前兩天碰到一個(gè)類似的bug笔横,于是借著這個(gè)機(jī)會(huì)了解了...
    閆仕偉閱讀 5,333評(píng)論 2 23
  • 觸摸事件的生命周期 當(dāng)我們手指觸碰屏幕的那一刻,一個(gè)觸摸事件便產(chǎn)生了铛碑。經(jīng)過(guò)進(jìn)程間通信狠裹,觸摸事件被傳遞到合適的應(yīng)用之...
    Gintok閱讀 1,354評(píng)論 0 3