在用戶使用app的過程中,會產生各種各樣的事件,在 iOS 中的事件大致可以分為3大類型:
觸摸事件
加速計事件
遠程控制事件
在 iOS中不是任何對象都能處理事件,只有繼承了UIResponder
的對象才能接收並處理事件。我們稱之為“響應者對象”。
UIApplication、UIViewController、UIView都繼承自UIResponder,因此它們都是響應者對象,都能夠接收並處理事件。
因為在UIResponder內部提供了以下方法來處理事件:
監聽 UIView 的觸摸事件,會調用以下方法:
//一根或者多根手指開始觸摸view,系統會自動調用view的touchesBegan方法 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;//一根或者多根手指在view上移動時,系統會自動調用view的touchesMoved方法//(隨著手指的移動,會持續調用該方法,也就是說這個方法會調用很多次) - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;//一根或者多根手指離開view,系統會自動調用view的touchesEnded方法 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;//當觸摸序列被諸如電話呼入這樣的系統事件所取消時,系統會調用touchesCancelled方法 - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
加速計事件會調用
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event; - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event; - (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;
遠程控制事件會調用
- (void)remoteControlReceivedWithEvent:(UIEvent *)event;
想要監聽UIViiew的觸摸事件,首先要自定義UIView,只有實現了UIResponder的事件方法才能夠監聽事件。
提示: touches 中存放的都是 UITouch 對象
當用戶用一根手指觸摸屏幕時,會創建一個與手指相關聯的 UITouch 對象,一根手指對應一個 UITouch 對象。
UITouch 的作用
保存跟手指有關的信息,比如觸摸的位置、時間、階段
當手指移動時,系統會更新同一個UITouch對象,使之能夠一直保存該手指在的觸摸位置
當手指離開屏幕時,系統會銷毀相應的UITouch對象
UITouch 的方法
- (CGPoint)locationInView:(UIView *)view;//返回值表示觸摸在view上的位置//這裡返回的位置是針對view的坐標系的(以view的左上角為原點(0, 0))//調用時傳入的view參數為nil的話,返回的是觸摸點在UIWindow的位置- (CGPoint)previousLocationInView:(UIView *)view;//該方法記錄了前一個觸摸點的位置
UIEvent 稱為事件對象,負責記錄事件產生的時刻和類型,每產生一個事件,就會產生一個 UIEvent 對象。
在 UIEvent 中提供了相應的方法可以獲取在某個 View 上面的觸摸對象(UITouch)。
在一次完整的觸摸過程中,至少會經歷開始、移動、結束三個狀態,在觸摸事件處理方法中,都有 touches 和 event 兩個參數。
一次完整的觸摸過程中,只會產生一個事件對象,4個觸摸方法都是同一個 event 參數。
如果兩根手指同時觸摸一個view,那麼view只會調用一次touchesBegan:withEvent:方法,touches參數中裝著2個UITouch對象。
如果這兩根手指一前一後分開觸摸同一個view,那麼view會分別調用2次touchesBegan:withEvent:方法,並且每次調用時的touches參數中只包含一個UITouch對象。
根據touches中UITouch的個數可以判斷出是單點觸摸還是多點觸摸。