原創文章,歡迎轉載。轉載請注明:關東升的部落格
應用與使用者進行互動,依賴于各種各樣的事件。事件響應者對象是可以響應事件并對其進行處理的對象,響應者鍊是由一系列連結在一起的響應者組成的。響應者鍊在事件進行中是非常重要的,響應者鍊可以把使用者事件路由給正确的對象。
響應者對象與響應鍊
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
歡迎關注關東升新浪微網誌@tony_關東升。
關注智捷課堂微信公共平台,了解最新技術文章、圖書、教程資訊
更多精品iOS、Cocos、移動設計課程請關注智捷課堂官方網站:http://www.zhijieketang.com
智捷課堂論壇網站:http://51work6.com/forum.php