iOS學習筆記05 觸控事件

執著丶執念發表於2018-06-02

###一、事件分發處理【由外到內】 在iOS中發生觸控後,事件會加到UIApplication事件佇列,UIApplication會從事件佇列取出最前面的事件進行分發處理,通常會先分發給主視窗,主視窗會呼叫hitTest:withEvent:方法,查詢適合的事件觸發檢視,即 找到被觸控的檢視物件 #####尋找流程如下:

  1. 在頂級檢視(keyWindow的檢視)上呼叫pointInside:withEvent:方法判斷觸控點是否在當前檢視內;
  1. 如果返回NO,那麼keyWindow的hitTest:withEvent:返回nil;
  2. 如果返回YES,那麼它會向當前檢視的所有子檢視傳送hitTest:withEvent:訊息,遍歷所有子檢視的順序是從subviews陣列的末尾向前遍歷(從介面最上方開始向下遍歷);
  3. 如果有subview的hitTest:withEvent:返回非空物件,則keyWindow的hitTest:withEvent:返回此物件,處理結束;
  4. 如果所有subview遍歷結束仍然沒有返回非空物件,則keyWindow的hitTest:withEvent:返回頂級檢視;

###二、響應者鏈條【由內到外】 找到被觸控的檢視物件後,還需要判斷該檢視物件是否能處理該觸控事件,如果不能處理,又該讓誰來處理,於是響應者鏈條出現,作用是 找到事件響應者

響應者鏈條圖示
######響應者鏈條原則:

  1. 觸控物件initalView無法響應事件時,傳遞給上級檢視superView去響應
  1. 如果上級檢視無法響應,繼續往上傳遞
  2. 往上傳遞直到傳遞到檢視控制器的根檢視controllerView,如果根檢視不響應,傳遞給檢視控制器viewController
  3. 檢視控制器不響應,傳遞給父檢視控制器的根檢視superControllerView,如果根檢視不響應,傳遞給父檢視控制器superViewController
  4. 頂級檢視控制器不能響應,傳遞給主視窗keyWindow
  5. keyWindow不能響應,傳遞給UIApplication處理
  6. UIApplication不能響應,該事件就會被 拋棄

###三、繼承UIResponder 以上 事件分發響應者鏈條 ,都不需要我們關心,這些操作是自動執行的,不需要我們去操作,我們只需要瞭解它們的原理就行。 在iOS中並不是所有的類都能處理並接受事件,只有繼承UIResponder的物件才能處理事件(*我們常用的UIViewUIViewControllerUIApplication都繼承自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^)/~,這裡就不列具體程式碼了。

相關文章