合適的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 能夠...