當(dāng)我們觸控手機(jī)屏幕時(shí)系統(tǒng)便會(huì)將這一操作封裝成一個(gè)UIEvent放到事件隊(duì)列里面,然后Application從事件隊(duì)列取出這個(gè)事件,接著需要找到去響應(yīng)這個(gè)事件的最佳視圖也就是Responder, 所以開(kāi)始的第一步應(yīng)該是找到Responder, 那么又是如何找到的呢奴愉?那就不得不引出UIView的2個(gè)方法:
- -(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
返回視圖層級(jí)中能響應(yīng)觸控點(diǎn)的最深視圖
- -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
返回視圖是否包含指定的某個(gè)點(diǎn)
通過(guò)在顯示視圖層級(jí)中依次對(duì)視圖調(diào)用這個(gè)2個(gè)方法來(lái)確認(rèn)該視圖是不是能響應(yīng)這個(gè)點(diǎn)擊的點(diǎn)竖伯,首先會(huì)調(diào)用hitTest灵嫌,然后hitTest會(huì)調(diào)用pointInside锋华,最終hitTest返回的那個(gè)view就是最終的響應(yīng)者
首先,當(dāng)發(fā)生事件響應(yīng)時(shí)恋日,必須知道由誰(shuí)來(lái)響應(yīng)事件膀篮。在IOS中,由響應(yīng)者鏈來(lái)對(duì)事件進(jìn)行響應(yīng)岂膳,所有事件響應(yīng)的類都是UIResponder的子類誓竿,響應(yīng)者鏈?zhǔn)且粋€(gè)由不同對(duì)象組成的層次結(jié)構(gòu),其中的每個(gè)對(duì)象將依次獲得響應(yīng)事件消息的機(jī)會(huì)谈截。當(dāng)發(fā)生事件時(shí)筷屡,事件首先被發(fā)送給第一響應(yīng)者涧偷,第一響應(yīng)者往往是事件發(fā)生的視圖,也就是用戶觸摸屏幕的地方毙死。事件將沿著響應(yīng)者鏈一直向下傳遞燎潮,直到被接受并做出處理。一般來(lái)說(shuō)扼倘,第一響應(yīng)者是個(gè)視圖對(duì)象或者其子類對(duì)象确封,當(dāng)其被觸摸后事件被交由它處理,如果它不處理再菊,事件就會(huì)被傳遞給它的視圖控制器對(duì)象viewcontroller(如果存在)爪喘,然后是它的父視圖(superview)對(duì)象(如果存在),以此類推袄简,直到頂層視圖腥放。接下來(lái)會(huì)沿著頂層視圖(top view)到窗口(UIWindow對(duì)象)再到程序(UIApplication對(duì)象)泛啸。如果整個(gè)過(guò)程都沒(méi)有響應(yīng)這個(gè)事件绿语,該事件就被丟棄。一般情況下候址,在響應(yīng)者鏈中只要由對(duì)象處理事件吕粹,事件就停止傳遞。
一個(gè)典型的相應(yīng)路線圖如:
First Responser -- > The Window -- >The Application -- > App Delegate
1岗仑、如果最終hit-test沒(méi)有找到第一響應(yīng)者匹耕,或者第一響應(yīng)者沒(méi)有處理該事件,則該事件會(huì)沿著響應(yīng)者鏈向上回溯荠雕,如果UIWindow實(shí)例和UIApplication實(shí)例都不能處理該事件稳其,則該事件會(huì)被丟棄;
2炸卑、hitTest:withEvent:方法將會(huì)忽略隱藏(hidden=YES)的視圖既鞠,禁止用戶操作(userInteractionEnabled=YES)的視圖,以及alpha級(jí)別小于0.01(alpha<0.01)的視圖盖文。如果一個(gè)子視圖的區(qū)域超過(guò)父視圖的bound區(qū)域(父視圖的clipsToBounds 屬性為NO嘱蛋,這樣超過(guò)父視圖bound區(qū)域的子視圖內(nèi)容也會(huì)顯示),那么正常情況下對(duì)子視圖在父視圖之外區(qū)域的觸摸操作不會(huì)被識(shí)別,因?yàn)楦敢晥D的pointInside:withEvent:方法會(huì)返回NO,這樣就不會(huì)繼續(xù)向下遍歷子視圖了五续。當(dāng)然洒敏,也可以重寫(xiě)pointInside:withEvent:方法來(lái)處理這種情況。
3疙驾、我們可以重寫(xiě)hitTest:withEvent:來(lái)達(dá)到某些特定的目的凶伙,實(shí)際應(yīng)用中很少用到這些。