IOS和OSX事件傳遞機制

2022-04-04 06:27:56 字數 2453 閱讀 2162

文章開頭說到有ios三種event型別,事件傳遞中uiwindow會根據不同的event,用不同的方式尋找initial object,initial object決定於當前的事件型別。比如touch event,uiwindow會首先試著把事件傳遞給事件發生的那個view,就是下文要說的hit-testview。對於motion和remote event,uiwindow會把例如震動或者遠端控制的事件傳遞給當前的firstresponder,有關firstresponder的相關資訊請看這裡。下面主要講touch event的hit-testview。

有了事件響應鏈,接下來的事情就是尋找響應事件的具體響應者了,我們稱著為:hit-testing view,尋找這個view的過程我們稱著為hit-test。

那麼什麼是hit-test呢,我們可以把它理解為乙個探測器,通過這個探測器我們可以找到並判斷手指是否點選在某個檢視上面,換句話說就是通過hit-test可以找到手指點選到的處於螢幕最前面的那個uiview。

在解釋hit-test是怎麼工作之前,先來看看它是什麼時候被呼叫的。前面說hit-test是乙個探測器,那麼在**裡面其實就是乙個函式,uiview有如下兩個方法:

- (uiview *)hittest:(cgpoint)point withevent:(uievent *)event

; - (bool)pointinside:(cgpoint)point withevent:(uievent *)event;

現在知道hit-test是什麼時候呼叫了,那麼接下來看看它是怎麼工作的。hit-test是採用遞迴的方法從view層級的根節點開始遍歷,看看下面這張圖:

uiwindow有乙個mianview,mainview裡面有三個subview:view a、view b、view c,他們各自有兩個subview,他們層級關係是:view a在最下面,view b中間,view c最上(也就是addsubview的順序,越晚add進去越在上面),其中view a和view b有一部分重疊。如果手指在view b.1和view a.2重疊的上面點選,按照上面說的遞迴方式,順序如下圖所示:

遞迴是向介面的根節點uiwindow傳送hittest:withevent:訊息開始的,從這個訊息返回的是乙個uiview,也就是手指當前位置最前面的那個 hittest view。 當向uiwindow傳送hittest:withevent:訊息時,hittest:withevent:裡面所做的事,就是判斷當前的點選位置是否在window裡面,如果在則遍歷window的subview然後依次對subview傳送hittest:withevent:訊息(注意這裡給subview傳送訊息是根據當前subview的index順序,index越大就越先被訪問)。如果當前的point沒有在view上面,那麼這個view的subview也就不會被遍歷了。當事件遍歷到了view b.1,發現point在view b.1裡面,並且view b.1沒有subview,那麼他就是我們要找的hittest view了,找到之後就會一路返回直到根節點,而view b之後的view a也不會被遍歷了。

一圖勝千言:

注意hittest裡面是有判斷當前的view是否支援點選事件,比如userinteractionenabled、hidden、alpha等屬性,都會影響乙個view是否可以相應事件,如果不響應則直接返回nil。 我們留意到還有乙個pointinside:withevent:方法,這個方法跟hittest:withevent:一樣都是uiview的乙個方法,通過他開判斷point是否在view的frame範圍內。如果這些條件都滿足了,那麼遍歷就可以繼續往下走了,**表現大概如下:

osx的事件響應大體上跟ios一樣的,但是有重要的差別:當事件遍歷到了view b.1,發現point在view b.1裡面,並且view b.1沒有subview,因此它就是我們要找的hittest view 了。但是hittest並不會停止,會繼續遍歷view a,viewa2也是我們要找的hitestview。遍歷如圖所示:

mousedown事件響應的順序為:

iOS事件傳遞機制

我的理解 第一步 hit testing找到 hit test view window,儲存在 呢?找到響應者鏈 響應者鏈中的view鏈,儲存在 呢?第二步 第乙個touch 1 touch 初始化,沿著鏈條找哪些要響應 event?不知道儲存在 2 沿著鏈條找哪些要響應 touch,儲存在 tou...

iOS事件的傳遞和響應機制

1.touch events 觸控事件 2.motion events 運動事件 3.remote events 遠端事件 4.press events 按壓事件 1.事件產生和傳遞 2.找到合適的view處理 3.處理事件或者捨棄 這裡主要是說觸控事件。響應者物件 可以處理事件的物件,即uires...

Android事件機制 事件傳遞和消費

關於android中的事件機制,用到的地方還是很多的,並且這個知識點還真有點複雜。在寫這篇文章前,網上看了不少博文,有的寫的感覺挺不錯的。只是當時感覺好像理解了,事後又很容易忘。現在自己也系統整理下吧。android中的事件在表現形式上有很多,如ontach onclick和onlongclick等...