###一、事件分發處理【由外到內】
在iOS中發生觸控後,事件會加到UIApplication
事件佇列,UIApplication
會從事件佇列取出最前面的事件進行分發處理,通常會先分發給主視窗,主視窗會呼叫hitTest:withEvent:
方法,查詢適合的事件觸發檢視,即 找到被觸控的檢視物件
#####尋找流程如下:
- 在頂級檢視(keyWindow的檢視)上呼叫
pointInside:withEvent:
方法判斷觸控點是否在當前檢視內;
- 如果返回NO,那麼keyWindow的
hitTest:withEvent:
返回nil; - 如果返回YES,那麼它會向當前檢視的所有子檢視傳送
hitTest:withEvent:
訊息,遍歷所有子檢視的順序是從subviews陣列的末尾向前遍歷(從介面最上方開始向下遍歷); - 如果有subview的
hitTest:withEvent:
返回非空物件,則keyWindow的hitTest:withEvent:
返回此物件,處理結束; - 如果所有subview遍歷結束仍然沒有返回非空物件,則keyWindow的
hitTest:withEvent:
返回頂級檢視;
###二、響應者鏈條【由內到外】 找到被觸控的檢視物件後,還需要判斷該檢視物件是否能處理該觸控事件,如果不能處理,又該讓誰來處理,於是響應者鏈條出現,作用是 找到事件響應者
######響應者鏈條原則:
- 觸控物件
initalView
無法響應事件時,傳遞給上級檢視superView
去響應
- 如果上級檢視無法響應,繼續往上傳遞
- 往上傳遞直到傳遞到檢視控制器的根檢視
controllerView
,如果根檢視不響應,傳遞給檢視控制器viewController
- 檢視控制器不響應,傳遞給父檢視控制器的根檢視
superControllerView
,如果根檢視不響應,傳遞給父檢視控制器superViewController
- 頂級檢視控制器不能響應,傳遞給主視窗
keyWindow
keyWindow
不能響應,傳遞給UIApplication
處理UIApplication
不能響應,該事件就會被 拋棄
###三、繼承UIResponder
以上 事件分發 和 響應者鏈條 ,都不需要我們關心,這些操作是自動執行的,不需要我們去操作,我們只需要瞭解它們的原理就行。
在iOS中並不是所有的類都能處理並接受事件,只有繼承UIResponder
的物件才能處理事件(*我們常用的UIView
、UIViewController
、UIApplication
都繼承自UIResponder
,它們都能接收並處理事件*),但繼承UIResponder
又不意味著一定能處理事件
######繼承 UIResponder 的物件,不能處理事件的情況:
userInteractionEnabled = NO;
hidden = YES;
alpha = 0 ~ 0.01;
- 沒有實現
touchesBegan:withEvent
方法
重寫UIResponder 觸控響應方法:
#pragma mark 觸控開始時會呼叫
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
#pragma mark 觸控移動時會頻繁呼叫
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
#pragma mark 觸控結束離開螢幕時會呼叫
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
#pragma mark 觸控意外取消時會呼叫,比如觸控時電話打進來
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
複製程式碼
###四、UITouch物件 ######在 UIResponder 觸控響應方法中,需要獲取 UITouch 物件:
//取得一個觸控物件(對於多點觸控可能有多個物件)
UITouch *touch = [touches anyObject];
//取得在指定檢視的觸控位置
CGPoint current = [touch locationInView:self.view];
//取得在指定檢視的前一個觸控位置
CGPoint previous = [touch previousLocationInView:self.view];
複製程式碼
######其他常用屬性:
- window : 觸控所在視窗
- view : 觸控所在檢視
- tapCount : 短時間點選次數
瞭解了這些,你就可以利用觸控事件做一些好玩的事情了,(^o^)/~,這裡就不列具體程式碼了。