響應(yīng)者鏈條

響應(yīng)者鏈條

一、觸摸事件處理的詳細(xì)過程

用戶點(diǎn)擊屏幕后產(chǎn)生的一個(gè)觸摸事件,經(jīng)過一些列的傳遞過程后,會(huì)找到最合適的視圖控件來處理這個(gè)事件
找到最合適的視圖控件后,就會(huì)調(diào)用控件的touches方法來作具體的事件處理
touchesBegan…
touchesMoved…
touchedEnded…
這些touches方法的默認(rèn)做法是將事件順著響應(yīng)者鏈條向上傳遞,將事件交給上一個(gè)響應(yīng)者進(jìn)行處理

二、響應(yīng)過程

一次完整的觸摸事件的傳遞響應(yīng)的過程
UIAppliction --> UIWiondw -->遞歸找到最適合處理事件的控件-->控件調(diào)用touches方法-->判斷是否實(shí)現(xiàn)touches方法-->沒有實(shí)現(xiàn)默認(rèn)會(huì)將事件傳遞給上一個(gè)響應(yīng)者-->找到上一個(gè)響應(yīng)者

三、重要說明

1.相關(guān)概念
響應(yīng)者鏈條概念: iOS系統(tǒng)檢測到手指觸摸(Touch)操作時(shí)會(huì)將其打包成一個(gè)UIEvent對象,并放入當(dāng)前活動(dòng)Application的事件隊(duì)列,單例的UIApplication會(huì)從事件隊(duì)列中取出觸摸事件并傳遞給單例的UIWindow來處理,UIWindow對象首先會(huì)使用hitTest:withEvent:方法尋找此次Touch操作初始點(diǎn)所在的視圖(View),即需要將觸摸事件傳遞給其處理的視圖,這個(gè)過程稱之為hit-test view。

響應(yīng)者對象(Responder Object): 指的是 有響應(yīng)和處理事件能力的對象。 響應(yīng)者鏈就是由一系列的響應(yīng)者對象 構(gòu)成的一個(gè)層次結(jié)構(gòu)。

UIResponder 是所有響應(yīng)對象的基類,在UIResponder類中定義了處理上述各種事件的接口。我們熟悉的 UIApplication、 UIViewController、 UIWindow 和所有繼承自UIView的UIKit類都直接或間接的繼承自UIResponder,所以它們的實(shí)例都是可以構(gòu)成響應(yīng)者鏈的響應(yīng)者對象。

UIWindow實(shí)例對象會(huì)首先在它的內(nèi)容視圖上調(diào)用hitTest:withEvent:,此方法會(huì)在其視圖層級結(jié)構(gòu)中的每個(gè)視圖上調(diào)用pointInside:withEvent:(該方法用來判斷點(diǎn)擊事件發(fā)生的位置是否處于當(dāng)前視圖范圍內(nèi),以確定用戶是不是點(diǎn)擊了當(dāng)前視圖),如果pointInside:withEvent:返回YES,則繼續(xù)逐級調(diào)用,直到找到touch操作發(fā)生的位置,這個(gè)視圖也就是要找的hit-test view。

2.處理原則
默認(rèn)做法是將事件順著響應(yīng)者鏈條向上傳遞,將事件交給上一個(gè)響應(yīng)者進(jìn)行處理
如何判斷當(dāng)前響應(yīng)者的上一個(gè)響應(yīng)者是誰?
(1)判斷當(dāng)前是否是控制器的View, 如果是控制器的View上一個(gè)響應(yīng)者就是控制器
(2)如果當(dāng)前不是控制器的View,上一個(gè)響應(yīng)者就是父控件

3.響應(yīng)者鏈條有什么用?
可以讓一個(gè)觸摸事件發(fā)生的時(shí)候讓多個(gè)響應(yīng)者同時(shí)響應(yīng)該事件

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event];
    NSLog(@"%@" , self.class);
}
四、響應(yīng)者鏈的事件傳遞過程

如果view的控制器存在,就傳遞給控制器;如果控制器不存在,則將其傳遞給它的父視圖
在視圖層次結(jié)構(gòu)的最頂級視圖,如果也不能處理收到的事件或消息,則其將事件或消息傳遞給window對象進(jìn)行處理
如果window對象也不處理,則其將事件或消息傳遞給UIApplication對象
如果UIApplication也不能處理該事件或消息,則將其丟棄
補(bǔ)充:蘋果官方文檔


cid0e1475d60a09fc3042a62c6cd6fabd9f.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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