應用與用戶進行交互,依賴於各種各樣的事件。事件響應者對象是可以響應事件並對其進行處理的對象,響應者鏈是由一系列鏈接在一起的響應者組成的。響應者鏈在事件處理中是非常重要的,響應者鏈可以把用戶事件路由給正確的對象。
響應者對象與響應鏈
UIResponder是所有響應者對象的基類,它不僅為事件處理,而且也為常見的響應者行為定義編程接口。UIApplication、UIView(及其子類,包括UIWindow)和UIViewController(及其子類)都直接或間接地繼承自UIResponder類。
第一響應者是應用程序中當前負責接收觸摸事件的響應者對象(通常是一個UIView對象)。UIWindow對象以消息的形式將事件發送給第一響應者,使其有機會首先處理事件。如果第一響應者沒有進行處理,系統就將事件(通過消息)傳遞給響應者鏈中的下一個響應者,看看它是否可以進行處理。
響應者鏈是一系列鏈接在一起的響應者對象,它允許響應者對象將處理事件的責任傳遞給其他更高級別的對象。隨著應用程序尋找能夠處理事件的對象,事件就在響應者鏈中向上傳遞。響應者鏈由一系列“下一個響應者”組成。
1.第一響應者將事件傳遞給它的視圖控制器(如果有的話),然後是它的父視圖。
2.類似地,視圖層次中的每個後續視圖都首先傳遞給它的視圖控制器(如果有的話),然後是它的父視圖。
3.最上層的容器視圖將事件傳遞給UIWindow對象。
4.UIWindow對象將事件傳遞給UIApplication單例對象。
觸摸事件
觸摸(UITouch)對象表示屏幕上的一個觸摸事件,訪問觸摸是通過UIEvent對象傳遞給事件響應者對象的。觸摸對象有時間和空間兩方面。
1.時間方面
時間方面信息稱為階段(phase),表示觸摸是否剛剛開始、是否正在移動或處於靜止狀態,以及何時結束,也就是手指何時從屏幕抬起。
在給定的觸摸階段中,如果發生新的觸摸動作或已有的觸摸動作發生變化,則應用程序就會發送這些消息。
當一個或多個手指觸碰屏幕時,發送touchesBegan:withEvent:消息。
當一個或多個手指在屏幕上移動時,發送touchesMoved:withEvent:消息。
當一個或多個手指離開屏幕時,發送touchesEnded:withEvent:消息。
2.空間方面
觸摸點對象還包括當前在視圖或窗口中的位置信息,以及之前的位置信息(如果有的話)。下面的方法是可以獲得觸摸點所在窗口或視圖中的位置。
func locationInView(_ view:UIView?) -> CGPoint
獲得前一個觸摸點所在窗口或視圖中的位置信息:
func previousLocationInView(_view: UIView?) -> CGPoint