麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

iOS開(kāi)發(fā)日記33-hit-Test

2019-11-14 18:10:40
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

今天博主有一個(gè)hitHest的需求,遇到了一些困難點(diǎn),在此和大家分享,希望能夠共同進(jìn)步.

當(dāng)我們點(diǎn)擊界面的時(shí)候,iOS是如何知道我們點(diǎn)擊的是哪一個(gè)View?

這個(gè)過(guò)程就是由hit-testing來(lái)完成的。通過(guò)hit-testing app 可以知道由那個(gè) view 來(lái)響應(yīng)事件。

下面我就簡(jiǎn)單介紹一下 hit-testing 是怎么運(yùn)作的。當(dāng)我們?cè)诮缑姘l(fā)生觸碰等手勢(shì)的時(shí)候,UIKit 就會(huì)打包出一個(gè) UIEvent 對(duì)象,并且會(huì)把這個(gè)對(duì)象傳遞給當(dāng)前正在活躍的 app ,分發(fā)給 app 后單利 UIapplication 就會(huì)從它的事件隊(duì)列里面取出一個(gè)事件進(jìn)行響應(yīng)。

然后接下來(lái) UIApplication 就要開(kāi)始煩惱要哪個(gè) View 來(lái)響應(yīng)這個(gè)事件,那么這個(gè)時(shí)候就是 hit-testing 出場(chǎng)的時(shí)候了。

hit-testing 的執(zhí)行過(guò)程是:當(dāng) UIApplication 接到 UIEvent 以后就會(huì)將事件傳給 UIWindow ,然后 UIWindow 將事件傳給它的 SubView ,然后再次傳給 SubView 判斷是不是發(fā)生在這個(gè) View 里面,直到找到最小的發(fā)生這個(gè)事件的 View 。

如果沒(méi)有找到就返回自身,然后從兄弟 View 又開(kāi)始找。 但是問(wèn)題來(lái)了 hit-testing 是以什么順序找 SubView 的呢。就是你添加 SubView 的逆序來(lái)遍歷的,換句話說(shuō)就是從最頂層的 SubView 開(kāi)始找。

如圖說(shuō)明:


 

我添加 View 的順序是:

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

所以 hit-testing 檢測(cè) SubView 的順序是:


 


所以 hit-testing 進(jìn)行的是深度優(yōu)先的檢測(cè),當(dāng)然也不是無(wú)腦的深度優(yōu)先,假如現(xiàn)在 View3 有自己的 SubView 那么 hit-testing 是不會(huì)檢測(cè) View3 的 SubView 的。

因?yàn)樵跈z測(cè) View3 的時(shí)候就已經(jīng)可以斷定事件發(fā)生的點(diǎn)不在 View3 內(nèi)所以它的 SubView 也是不會(huì)檢測(cè)的。所以 hit-testing 在檢測(cè)的時(shí)候還是會(huì)進(jìn)行進(jìn)行剪枝的從而提高效率。

在知道了 hit-testing 的檢測(cè)過(guò)程以后在代碼里面是怎么實(shí)現(xiàn)的呢?當(dāng)然我們不可能準(zhǔn)確的知道只能是猜測(cè)大概的情況。

在 UIView 中有兩個(gè)方法分別是:

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

hit-testing 就是調(diào)用

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

來(lái)得到發(fā)生事件的最小的 UIView ,而就是通過(guò)調(diào)用

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

來(lái)判斷一個(gè)事件是否發(fā)生在一個(gè) UIView 中。所以過(guò)程應(yīng)該是 UIView 在接受到 hit-testing 消息后,先是判斷自身的 alpha 、userInteractionEnabled、hidden 等屬性,如果這些屬性不滿足要求那么

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

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

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

判斷事件是否發(fā)生在自己這里,如果不在自己這里,就返回 nill ,如果是在自己這里那么就對(duì)自己的 SubView 調(diào)用

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

從而得到一個(gè) View 并且返回。

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

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

所以有趣的事情就多了


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 最新av在线免费观看 | 亚洲国产精品高潮呻吟久久 | 婷婷中文字幕一区二区三区 | 亚洲成人福利在线观看 | 久久国产28| 噜噜噜躁狠狠躁狠狠精品视频 | 免费观看视频在线 | 国产精品入口夜色视频大尺度 | 色日本视频 | 欧美性黄 | 99精品视频免费 | 亚洲片在线 | 亚洲最大的成人网 | 亚洲影视在线 | 成人一区二区在线观看视频 | 久久精品久久精品国产大片 | 七首小情歌泰剧在线播放 | 国产喷白浆10p | 欧美a久久 | 一区二区三区日韩在线观看 | 精精国产xxxx视频在线播放7 | 一道本不卡一区 | 久久久久久久高清 | 久久国产精品二国产精品中国洋人 | 一级外国毛片 | 全黄性性激高免费视频 | 九九热欧美 | 一区二区三区日韩电影 | 一级电影免费 | 免费毛片电影 | 欧美a在线看 | 欧美韩国日本在线 | 九九视频精品在线 | 一区二区三区精品国产 | 蜜桃网站在线 | 久久国产免费视频 | 免费一级在线视频 | 欧美aaaaaaaa | 国产91精品久久久久久久 | hd porn 4k video xhicial| 国产成人高清在线 |