iOS 事件傳遞

2021-07-03 01:34:09 字數 1431 閱讀 2985

合適的view的標準

1) 能接收觸控事件。

2)觸控點在自己身上。

第2點很容易明白,但是第1點有點模糊,乙個view怎樣才能接收觸控事件呢,其實只要知道了不能接收事件的情況,剩下的就是能接收事件的情況了。

滿足以下3點之一,view不能接收事件:

a. userinte***nceenable = no

b. hidden = yes

c. 0 < alpha <0.01

怎麼找?

從uiwidow開始,首先用2的標準判斷自身是否是合適的view。

如果不是,那麼告訴父控制項自己不是,父控制項就是最合適的view(注意如果window不是合適的view,那麼這個事件就會被廢棄);

如果是,這時它會去找最合適的view。會按新增順序從後往前遍歷自己的子控制項(之所以要從後往前找,是出於效能的考慮,因為往往後加的檢視是最有可能被點的),讓子控制項重複剛才的判斷步驟,遞迴下去找到最合適的view。

**實現

剛才所說的都是文字描述,那麼3所說的過程的**表現是什麼樣的呢?

當事件被傳遞到乙個view上,系統會自動呼叫該view的以下方法:

- (uiview *)hittest:(cgpoint)point withevent:(uievent *)event
在這個方法中做2的合適標準判斷,並把最合適的view傳遞回去。我們往往可以重新該方法,自己指定view去處理事件。

模擬hittest:withevent:方法的實現

在這個方法中我們知道它做了如下的事情:

1) 判斷能否接收觸控事件。

2) 觸控點是否在自己的身上。

3) 返回最合適的view。

判斷能否接收事件很容易,看**

// 不能接收觸控事件

self

.userinteractionenabled == no || self

.hidden == yes || self

.alpha

<=0.01

但是如何判斷觸控點在自己身上呢?再介紹下面方法:

- (bool)pointinside:(cgpoint)point withevent:(uievent *)event
這方法返回yes就表示摸在了自己身上,返回no表示沒被摸到。(注意:這裡的point表示的是呼叫者所在座標系的點)

有了這些我們就可以自己實現事件的分發過程了:

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

}// 來到這說明,沒有找到更合適的view,那麼自己就是最合適的view

return

self;

}

IOS 事件傳遞說明

ios手勢是ios開發不可或缺的一部分,但對於ios的手勢及事件相應機理大家並不知道,所以今天給大家講一講ios的事件相應機理 首先,ios的事件傳遞是依靠 事件鏈 傳遞的,當傳遞到鏈的某乙個鏈環上的物件處理了這個事件,事件就停止傳遞。那麼事件鏈是神馬東西?事件鏈是由一組uiresponder 能夠...

IOS 事件傳遞說明

ios手勢是ios開發不可或缺的一部分,但對於ios的手勢及事件相應機理大家並不知道,所以今天給大家講一講ios的事件相應機理 首先,ios的事件傳遞是依靠 事件鏈 傳遞的,當傳遞到鏈的某乙個鏈環上的物件處理了這個事件,事件就停止傳遞。那麼事件鏈是神馬東西?事件鏈是由一組uiresponder 能夠...

IOS 事件傳遞說明

ios手勢是ios開發不可或缺的一部分,但對於ios的手勢及事件相應機理大家並不知道,所以今天給大家講一講ios的事件相應機理 首先,ios的事件傳遞是依靠 事件鏈 傳遞的,當傳遞到鏈的某乙個鏈環上的物件處理了這個事件,事件就停止傳遞。那麼事件鏈是神馬東西?事件鏈是由一組uiresponder 能夠...