国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

iOS開發日記33-hit-Test

2019-11-14 18:10:40
字體:
來源:轉載
供稿:網友

今天博主有一個hitHest的需求,遇到了一些困難點,在此和大家分享,希望能夠共同進步.

當我們點擊界面的時候,iOS是如何知道我們點擊的是哪一個View?

這個過程就是由hit-testing來完成的。通過hit-testing app 可以知道由那個 view 來響應事件。

下面我就簡單介紹一下 hit-testing 是怎么運作的。當我們在界面發生觸碰等手勢的時候,UIKit 就會打包出一個 UIEvent 對象,并且會把這個對象傳遞給當前正在活躍的 app ,分發給 app 后單利 UIapplication 就會從它的事件隊列里面取出一個事件進行響應。

然后接下來 UIApplication 就要開始煩惱要哪個 View 來響應這個事件,那么這個時候就是 hit-testing 出場的時候了。

hit-testing 的執行過程是:當 UIApplication 接到 UIEvent 以后就會將事件傳給 UIWindow ,然后 UIWindow 將事件傳給它的 SubView ,然后再次傳給 SubView 判斷是不是發生在這個 View 里面,直到找到最小的發生這個事件的 View 。

如果沒有找到就返回自身,然后從兄弟 View 又開始找。 但是問題來了 hit-testing 是以什么順序找 SubView 的呢。就是你添加 SubView 的逆序來遍歷的,換句話說就是從最頂層的 SubView 開始找。

如圖說明:


 

我添加 View 的順序是:

[self.view addSubView:View1];[self.view addSubView:View2];[self.view addSubView:View3];

所以 hit-testing 檢測 SubView 的順序是:


 


所以 hit-testing 進行的是深度優先的檢測,當然也不是無腦的深度優先,假如現在 View3 有自己的 SubView 那么 hit-testing 是不會檢測 View3 的 SubView 的。

因為在檢測 View3 的時候就已經可以斷定事件發生的點不在 View3 內所以它的 SubView 也是不會檢測的。所以 hit-testing 在檢測的時候還是會進行進行剪枝的從而提高效率。

在知道了 hit-testing 的檢測過程以后在代碼里面是怎么實現的呢?當然我們不可能準確的知道只能是猜測大概的情況。

在 UIView 中有兩個方法分別是:

- (BOOL)pointInside:(CGPoint)*point* withEvent:(UIEvent *)*event;- (UIView *)hitTest:(CGPoint)*point* withEvent:(UIEvent *)*event;

hit-testing 就是調用

- (UIView *)hitTest:(CGPoint)*point* withEvent:(UIEvent *)*event;

來得到發生事件的最小的 UIView ,而就是通過調用

- (BOOL)pointInside:(CGPoint)*point* withEvent:(UIEvent *)*event;

來判斷一個事件是否發生在一個 UIView 中。所以過程應該是 UIView 在接受到 hit-testing 消息后,先是判斷自身的 alpha 、userInteractionEnabled、hidden 等屬性,如果這些屬性不滿足要求那么

- (UIView *)hitTest:(CGPoint)*point* withEvent:(UIEvent *)*event;

直接返回 nill ,如果符合要求就掉用 

- (BOOL)pointInside:(CGPoint)*point* withEvent:(UIEvent *)*event;

判斷事件是否發生在自己這里,如果不在自己這里,就返回 nill ,如果是在自己這里那么就對自己的 SubView 調用

- (UIView *)hitTest:(CGPoint)*point* withEvent:(UIEvent *)*event;

從而得到一個 View 并且返回。

那么到這里為止 hit-testing 的具體過程就講完了,那么知道了有什么好處呢?在 UIView 的子類中我們可以重寫

- (UIView *)hitTest:(CGPoint)*point* withEvent:(UIEvent *)*event;

所以有趣的事情就多了


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 靖西县| 耒阳市| 吕梁市| 沙湾县| 桐庐县| 霍林郭勒市| 大足县| 海盐县| 安乡县| 台江县| 云龙县| 扶风县| 定安县| 黄陵县| 辽源市| 曲阳县| 乐都县| 神木县| 武夷山市| 平潭县| 额敏县| 龙泉市| 台江县| 合作市| 扬中市| 聊城市| 定西市| 历史| 淮滨县| 洪洞县| 尼勒克县| 德州市| 巩义市| 上高县| 定兴县| 娄底市| 黄陵县| 囊谦县| 新巴尔虎右旗| 台中县| 贺兰县|