hittest:WithEvent事件傳遞和響應(yīng)者鏈條

事件的產(chǎn)生和傳遞
(1).發(fā)生觸摸事件后撵幽,系統(tǒng)會將該事件加入到一個由UIApplication管理的事件隊列中

(2).UIApplication會從事件隊列中取出最前面的事件尝蠕,并將事件分發(fā)下去以便處理血柳,通常,先發(fā)送事件給應(yīng)用程序的主窗口(keyWindow)

(3).主窗口會在視圖層次結(jié)構(gòu)中找到一個最合適的視圖來處理觸摸事件(通過hittest:withEvent:)宾茂,這也是整個事件處理過程的第一步

(4).找到合適的視圖控件后瓷马,就會調(diào)用視圖控件的touches方法來作具體的事件處理
touchesBegan…
touchesMoved…
touchedEnded…

屏幕快照 2017-04-14 15.15.33.png

觸摸事件處理的詳細(xì)過程
(1).用戶點(diǎn)擊屏幕后產(chǎn)生的一個觸摸事件,經(jīng)過一系列的傳遞過程后跨晴,會找到最合適的視圖控件來處理這個事件(通過hittest:withEvent:)

(2).找到最合適的視圖控件后欧聘,就會調(diào)用控件的touches方法來作具體的事件處理
touchesBegan…
touchesMoved…
touchedEnded…

(3).這些touches方法的默認(rèn)做法是將事件順著響應(yīng)者鏈條向上傳遞,將事件交給上一個響應(yīng)者進(jìn)行處理

屏幕快照 2017-04-14 15.19.10.png

事件傳遞的完整過程
1> 先將事件對象由上往下傳遞(由父控件傳遞給子控件)端盆,找到最合適的控件來處理這個事件(通過hittest:withEvent:)怀骤。

2> 調(diào)用最合適控件的touches….方法

3> 如果調(diào)用了[super touches….];就會將事件順著響應(yīng)者鏈條往上傳遞,傳遞給上一個響應(yīng)者

4> 接著就會調(diào)用上一個響應(yīng)者的touches….方法
如何判斷上一個響應(yīng)者

1> 如果當(dāng)前這個view是控制器的view,那么控制器就是上一個響應(yīng)者

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

響應(yīng)者鏈的事件傳遞過程
1>如果view的控制器存在焕妙,就傳遞給控制器蒋伦;如果控制器不存在,則將其傳遞給它的父視圖
2>在視圖層次結(jié)構(gòu)的最頂級視圖焚鹊,如果也不能處理收到的事件或消息痕届,則其將事件或消息傳遞給window對象進(jìn)行處理
3>如果window對象也不處理,則其將事件或消息傳遞給UIApplication對象
4>如果UIApplication也不能處理該事件或消息末患,則將其丟棄

實(shí)現(xiàn)hittest:withEvent:方法(該方法用于找到最合適的UIView來接收該觸摸事件)

// 作用:尋找最合適view
// 什么時候調(diào)用,只要一個事件傳遞給一個控件,就會調(diào)用這個控件的hitTest
// 返回誰,誰就是最合適view

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    // 1.判斷下自己能否接收事件
    if (self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01) return nil;
    
    // 2.判斷下點(diǎn)在不在當(dāng)前控件上
    if ([self pointInside:point withEvent:event] == NO) return  nil; // 點(diǎn)不在當(dāng)前控件
        
    
    // 3.從后往前遍歷自己的子控件
    // 1 0
    int count = self.subviews.count;
    for (int i = count - 1; i >= 0; i--) {
        // 獲取子控件
       UIView *childView = self.subviews[i];
        
        // 把當(dāng)前坐標(biāo)系上的點(diǎn)轉(zhuǎn)換成子控件上的點(diǎn)
      CGPoint childP =  [self convertPoint:point toView:childView];
        
       UIView *fitView = [childView hitTest:childP withEvent:event];
        
        if (fitView) {
            return fitView;
        }
        
    }
    
    // 4.如果沒有比自己合適的子控件,最合適的view就是自己
    return self;
    
}

版權(quán)印為您的作品印上版權(quán)83135512

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末研叫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子璧针,更是在濱河造成了極大的恐慌嚷炉,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件探橱,死亡現(xiàn)場離奇詭異申屹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)隧膏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門独柑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人私植,你說我怎么就攤上這事〕岛ǎ” “怎么了曲稼?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵索绪,是天一觀的道長。 經(jīng)常有香客問我贫悄,道長瑞驱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任窄坦,我火速辦了婚禮唤反,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鸭津。我一直安慰自己彤侍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布逆趋。 她就那樣靜靜地躺著盏阶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪闻书。 梳的紋絲不亂的頭發(fā)上名斟,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機(jī)與錄音魄眉,去河邊找鬼砰盐。 笑死,一個胖子當(dāng)著我的面吹牛坑律,可吹牛的內(nèi)容都是我干的岩梳。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼脾歇,長吁一口氣:“原來是場噩夢啊……” “哼蒋腮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起藕各,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤池摧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后激况,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體作彤,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年乌逐,在試婚紗的時候發(fā)現(xiàn)自己被綠了竭讳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡浙踢,死狀恐怖绢慢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洛波,我是刑警寧澤胰舆,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布骚露,位于F島的核電站,受9級特大地震影響缚窿,放射性物質(zhì)發(fā)生泄漏棘幸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一倦零、第九天 我趴在偏房一處隱蔽的房頂上張望误续。 院中可真熱鬧,春花似錦扫茅、人聲如沸蹋嵌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽欣尼。三九已至,卻和暖如春停蕉,著一層夾襖步出監(jiān)牢的瞬間愕鼓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工慧起, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留菇晃,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓蚓挤,卻偏偏與公主長得像磺送,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子灿意,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評論 2 361

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