IOS 響應者鏈條

2022-08-03 09:03:12 字數 2196 閱讀 8392

對於ios裝置使用者來說,他們操作裝置的方式主要有三種:觸控螢幕、晃動裝置、通過遙控設施控制裝置。對應的事件型別有以下三種:

1、觸屏事件(touch event)

2、運動事件(motion event)

3、遠端控制事件(remote-control event)

響應者物件(responder object)

指的是有響應和處理事件能力的物件。

響應者鏈就是由一系列的響應者物件

構成的乙個層次結構。

uiresponder是所有響應物件的基類,在uiresponder類中定義了處理上述各種事件的介面。我們熟悉的

uiwindow

和所有繼承自uiview的uikit類都直接或間接的繼承自uiresponder,所以它們的例項都是可以構成響應者鏈的響應者物件。

uiwindow例項物件會首先在它的內容檢視上呼叫hittest:withevent:,此方法會在其檢視層級結構中的每個檢視上呼叫pointinside:withevent:(該方法用來判斷點選事件發生的位置是否處於當前檢視範圍內,以確定使用者是不是點選了當前檢視),如果pointinside:withevent:返回yes,則繼續逐級呼叫,直到找到touch操作發生的位置,這個檢視也就是要找的hit-test view。

hittest:withevent:方法的處理流程如下:

首先呼叫當前檢視的pointinside:withevent:方法判斷觸控點是否在當前檢視內;

若返回no,則hittest:withevent:返回nil;

若返回yes,則向當前檢視的所有子檢視(subviews)傳送hittest:withevent:訊息,所有子檢視的遍歷順序是從最頂層檢視一直到到最底層檢視,即從subviews陣列的末尾向前遍歷,直到有子檢視返回非空物件或者全部子檢視遍歷完畢;

若第一次有子檢視返回非空物件,則hittest:withevent:方法返回此物件,處理結束;

如所有子檢視都返回非,則hittest:withevent:方法返回自身(self)。

假如使用者點選了view e,下面結合圖二介紹hit-test view的流程:

1、a是uiwindow的根檢視,因此,uiwindwo物件會首相對a進行hit-test;

2、顯然使用者點選的範圍是在a的範圍內,因此,pointinside:withevent:返回了yes,這時會繼續檢查a的子檢視;

3、這時候會有兩個分支,b和c:

點選的範圍不再b內,因此b分支的pointinside:withevent:返回no,對應的hittest:withevent:返回nil;

點選的範圍在c內,即c的pointinside:withevent:返回yes;

4、這時候有d和e兩個分支:

點選的範圍不再d內,因此d的

pointinside:withevent:返回no,對應的hittest:withevent:返回nil;

點選的範圍在e內,即e的

pointinside:withevent:返回yes,由於e沒有子檢視(也可以理解成對e的子檢視進行hit-test時返回了nil),因此,e的hittest:withevent:

會將e返回,再往回回溯,就是c的hittest:withevent:返回e--->>a的hittest:withevent:返回e。

至此,本次點選事件的第一響應者就通過響應者鏈的事件分發邏輯成功的找到了。

不難看出,這個處理流程有點類似二分搜尋的思想,這樣能以最快的速度,最精確地定位出能響應觸控事件的uiview。

說明:2、hittest:withevent:方法將會忽略隱藏(hidden=yes)的檢視,禁止使用者操作(userinteractionenabled=yes)的檢視,以及alpha級別小於0.01(alpha<0.01)的檢視。如果乙個子檢視的區域超過父檢視的bound區域(父檢視的clipstobounds 屬性為no,這樣超過父檢視bound區域的子檢視內容也會顯示),那麼正常情況下對子檢視在父檢視之外區域的觸控操作不會被識別,因為父檢視的pointinside:withevent:方法會返回no,這樣就不會繼續向下遍歷子檢視了。當然,也可以重寫pointinside:withevent:方法來處理這種情況。

3、我們可以重寫hittest:withevent:來達到某些特定的目的,下面的鏈結就是乙個有趣的應用舉例,當然實際應用中很少用到這些。

響應者鏈條

發生觸控事件後,系統佇列 不接收使用者互動 userinteractionenabled no隱藏 hidden yes透明 alpha 0.0 0.01 主視窗會在檢視層次結構中 找到乙個最合適的檢視來處理觸控事件 但是這僅僅是整個事件處理過程的第一步 找到合適的檢視控制項後,就會呼叫檢視控制項的...

響應者鏈條

所謂的響應者鏈條簡單的說 就是一級一級的查詢處理該事件的物件.當查詢到合適的物件,則執行該任務.它的目的 主迴圈捕捉到事件,找到最佳合適處理該事件的響應者 對於ios裝置使用者來說,他們操作裝置的方式主要有三種 觸控螢幕 晃動裝置 通過遙控設施控制裝置。對應的事件型別有以下三種 1 觸屏事件 tou...

事件處理響應者鏈條

mj 事件的完整處理過程 1.先將事件物件由上往下傳遞 由父控制項傳遞給子控制項 找到最合適的控制項來處理這個事件 2.呼叫最合適控制項的touches.方法 3.如果touches.裡面呼叫了 super touches.方法,則順著響應者鏈條往上找,找到上乙個響應者 4.執行上乙個響應者的tou...