IOS 開發 手勢 及事件傳遞機理

2021-06-22 11:03:23 字數 1819 閱讀 1466

ios手勢是ios開發不可或缺的一部分,但對於ios的手勢及事件相應機理大家並不知道,所以今天給大家講一講ios的事件相應機理

首先,ios的事件傳遞是依靠「事件鏈」傳遞的,當傳遞到鏈的某乙個鏈環上的物件處理了這個事件,事件就停止傳遞。那麼事件鏈是神馬東西?

事件鏈是由一組uiresponder(能夠響應時間的基類)組成的物件,當然有事件頭和事件尾,事件從頭開始傳遞的,挨個詢問是否處理當前事件。處理的話,就停止傳遞。

圖1從圖中可以看出紅色的標號和箭頭,這個是事件鏈的順序。那麼事件鏈是如何產生的呢,有以下兩種情況。

1.addsubview,將乙個普通的view b加到 a上 那麼b的nextresponder(下乙個響應者) 就被賦值為a。

2.如果乙個veiw不是普通的view,它是某個viewcontroller的根veiw,例如圖中的a,a的nextresponder在a從初始化完後就賦值為viewcontrollera。然後當a被addsubview到rootview的時候,controller a的nextresponder被複製為rootview。

事件鏈的構建不是統一在某乙個地方一次構建,而是當產生addsubview時或者在viewcontroller 初始化view時就會觸發。觸發的僅僅是兩個物件,superview和 subview,或者是superview和subview的viewcontroller

既然事件鏈是乙個樹形結構,那麼事件也就不能view的兄弟之間傳遞。

講完事件鏈,那麼下來事件是如何傳遞的。

如何確定事件鏈。

有個hittesting過程。如下

首先先找到window ,

1.呼叫hittest:withevent:,hittest:withevent:先呼叫pointinside:withevent:來判斷事件是否發生在自己的區域內

2.如果返回yes,那麼就從window的每個subview開始呼叫1過程。然後一層一層呼叫下去找到最頂部的view。

當然了hittest:withevent:在除了pointinside:withevent:同時,還會參考view的userinteractionenabled和view的隱藏屬性及alpha值,當view隱藏,或者userinteractionenabled為no,或者alpha小於0.01, hittest:withevent:會返回no。比如說view a 和view b,如下圖

圖2a和b的superview 首先會調hittest:withevent:在b上,發現b隱藏,或者userinteractionenabled為no,或者alpha小於0.01,那麼它就放棄了b,轉而檢查a。

以上就是確定事件鏈,然後傳遞就很簡單了。但是有了手勢以後,稍微複雜了點。

首先,我們每個手勢,其實是一系列的uievent。

1,每次傳遞其中有乙個,他會從事件鏈的最前面開始傳遞,先講event傳遞給事件鏈頂部的view的手勢們。然後看有沒有識別的,如果沒有就繼續到下乙個響應者的手勢們,如果立即識別,那麼就停止傳遞。如果傳遞了整個鏈,還沒有發現有識別的,怎麼辦呢。別以為事件就丟掉了,事件會從回到鏈的最前端,然後開始找第乙個實現touch(touchbegin,touchend,等等)的view進行識別,然後停止本次傳遞。

2.從時間中再取出乙個,繼續進行一過程。最終到沒有事件位置。

以上就算事件的傳遞和識別的整個過程。

對於手勢的引數設定及特殊viewdui時間傳遞處理待續。

《iOS開發筆記 事件與手勢》

ios事件 觸控事件 運動事件 一 觸控事件 一 事件分發處理 由外到內 尋找流程如下 在頂級檢視 keywindow的檢視 上呼叫pointinside withevent 方法判斷觸控點是否在當前檢視內 如果返回no,那麼keywindow的hittest withevent 返回nil 如果返...

IOS開發之 事件處理 手勢識別 71

ios3.2之後,蘋果推出了手勢識別功能 guesture recognizer 在觸控事件處理方面,大大簡化了開發者的開發難度 uigesturerecognizer是乙個抽象類,定義了所有手勢的基本行為,使用它的子類才能處理具體的手勢 手勢uitapgesturerecognizer tap u...

iOS 事件傳遞

合適的view的標準 1 能接收觸控事件。2 觸控點在自己身上。第2點很容易明白,但是第1點有點模糊,乙個view怎樣才能接收觸控事件呢,其實只要知道了不能接收事件的情況,剩下的就是能接收事件的情況了。滿足以下3點之一,view不能接收事件 a.userinte nceenable no b.hid...