iOS學習筆記之觸摸事件&UIResponder

iOS學習筆記之觸摸事件&UIResponder

觸摸事件

與觸摸事件相關的四個方法以下:web

  • 一根手指或多根手指觸摸屏幕windows

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
  • 一根手指或多根手指在屏幕上移動(隨着手指的移動,相關的對象會持續發送該消息)學習

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
  • 一根手指或多根手指離開屏幕ui

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
  • 在觸摸操做正常結束以前,某個系統事件(例若有電話進來)打斷了觸摸過程spa

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

UITouch對象和事件相應方法的工做機制

  • 一個UITouch對象對應屏幕上的一根手指。只要手指沒有離開屏幕,相應的UITouch對象就會一直存在。這些UITouch對象都會保存對應的手指在屏幕上的當前位置指針

  • 在觸摸事件的持續過程當中,不管發生什麼,最初發生觸摸事件的那個視圖都會在各個階段收到應用的觸摸事件消息。即便手指在移動時離開了這個視圖的frame區域,系統仍是會向該視圖發送touchesMoved:withEvent:和touchesEnded:withEvent:消息。也就是說,當某個視圖發生觸摸事件後,該視圖將永遠「擁有」當時建立的全部UITouch對象。code

  • 本身編寫的代碼不須要也不該該保留任何UITouch對象。當某個UITouch對象的狀態發生改變時,系統會向指定的對象發送特定的事件消息,並傳入發生變化的UITouch對象對象

iOS在處理觸摸事件的機制和windows中的消息機制很類似。當某個應用發生觸摸事件後,系統都會將該事件添加到一個事件隊列裏,這個事件隊列是由UIApplication單例管理的。UIApplication會向「擁有」該事件的視圖發送特定的UIResponder消息,收到消息的視圖會進行進一步的處理。blog

多點觸摸

默認狀況下,視圖在同一時刻只能接收一個觸摸事件。若是一根手指已經出發了touchesBegan:withEvent:方法,那麼在手指離開屏幕以前(觸發touchesEnded:withEvent:方法以前),其餘觸摸事件都會被忽略。爲此,須要在接收觸摸事件的UIView的初始化方法中添加以下代碼,以容許多點觸摸隊列

self.multipleTouchEnabled = YES;

響應對象鏈

UIResponder對象的子類對象除了UIView外,還包括UIViewController、UIWindow和UIApplication,這些對象可以經過響應對象連接收事件。
UIResponder對象擁有一個名爲nextResponder的指針,相關的UIResponder對象能夠經過該指針組成一個響應對象鏈,以下圖所示
enter description here

當UIView對象屬於某個UIViewController對象時,其nextResponder指針就會指向包含該視圖的UIViewController對象。當UIView對象不屬於任何UIViewController對象時,其nextResponder指針就會指向該視圖的父視圖。UIViewController對象的nextResponder指針一般會指向其視圖的父視圖。最頂層的父視圖是UIWindow對象,而UIWindow對象的nextResponder指向的是UIApplication單例。
若是沒有爲某個UIResponder對象覆蓋特定的事件處理方法,那麼該對象的nextResponder會嘗試處理相應的觸摸事件。事件會沿着響應對象鏈傳播,知道傳遞給UIApplication對象(響應對象鏈的最後一個對象),若是UIApplication也沒法處理事件,系統就會丟棄該事件。

相關文章
相關標籤/搜索