手勢和觸控基礎(chǔ)知識
觸摸控制 是 iOS 系統(tǒng)交互的核心方式。
觸控
Cocoa Touch 以盡可能簡單地方式實現(xiàn)了直接的操控。它會把觸控事件發(fā)送給你正在進行交互的視圖。
每一次觸控都會轉(zhuǎn)達很多的信息: 觸控發(fā)生的位置,點擊屏幕的次數(shù),觸控發(fā)生的時間。
iOS 使用 響應(yīng)鏈 (responder chain) 來確定究竟是哪個對象應(yīng)該對觸控做出響應(yīng)。 響應(yīng)者(responders)是響應(yīng) 事件(event) 的對象。 這些響應(yīng)者扮演的角色就好比是一串管理者,對這些 事件(event)進行管理。當(dāng)用戶觸摸屏幕時,應(yīng)用會去尋找一個對象來處理這一個觸控事件。 觸摸(touch)被傳遞下去,從一個視圖到另外一個視圖,直到一些對象來接管并且對這個 事件(event)做出響應(yīng)。
在大多數(shù)情況下,觸摸(touches)以及其信息 被存儲在 UITouch 對象中,觸摸(touches)以組的形式在 UIEvent 對象中傳遞。每一個 UIEvent 對象都代表了一個單一的 觸控事件,包含一次或多次觸摸。這一點既決定了開發(fā)者如何去響應(yīng)用戶的操作,也決定了用戶怎么在屏幕上進行操作。
你的應(yīng)用通過 視圖(UIView 或其子類的實例對象) 或者 視圖控制器(UIViewController 或其子類的實例對象) 來接收 觸摸(touches)。實現(xiàn)處理 觸摸(touch)的類需要通過繼承 UIResponder 類來實現(xiàn)。 你將會決定在哪兒處理和響應(yīng)這些 觸摸(touches)。 那些嘗試不使用 responder 類來實現(xiàn)簡單手勢控制的開發(fā)新人會遇到很多麻煩。
在視圖上處理 觸摸(touches) 看似違反直覺。你可能想去把界面顯示的方式和它對 touches 做出響應(yīng)的方式分離開。進一步說,視圖直接響應(yīng)觸控來實現(xiàn)交互看似違反了 MVC 設(shè)計模式,但是這樣做是很有必要的,而且可以提高封裝性。
階段
touches 是具有生命周期的。任意一個 touch 都會經(jīng)歷五個階段。
- UITouchPhaseBegan - 當(dāng)用戶剛接觸屏幕的時候
- UITouchPhaseMoved - 當(dāng)這個接觸動作在屏幕上移動時
- UITouchPhaseStationary - 當(dāng)一個接觸動作在屏幕上停止住時
- UITouchPhaseEnded - 當(dāng)用戶的手指從屏幕上移開時
- UITouchPhaseCancelled - 當(dāng) iOS 系統(tǒng)停止跟蹤一個 touch 時。 通常發(fā)生在,系統(tǒng)中斷或者是視圖從窗口移除或者是處在非激活狀態(tài)(有來電)。
這五個階段用來劃分一個觸控事件發(fā)生過程中的整個流程。
觸控和響應(yīng)方法
所有 UIResponder 類的子類,包括 UIView 和 UIViewController 都會對 touches 做出響應(yīng)。每一個類都決定了自身是否響應(yīng)或者是如何去響應(yīng)。當(dāng)需要去做出響應(yīng)時,這些類的實例會對用戶的觸控按照自己的方式進行響應(yīng)。
預(yù)定義的回調(diào)方法能處理觸控開始,觸控移動,觸控結(jié)束這幾種情形。和 階段(Phase)相對應(yīng)。方法如下:
- touchesBegan: withEvent: - 在觸控剛剛發(fā)生的時候被調(diào)用
- touchesMoved: withEvent: - 在觸控移動的時候被調(diào)用
- touchesEnded: withEvent: - 在觸控結(jié)束的時候被調(diào)用
- touchesCancelled: withEvent: - 當(dāng)系統(tǒng)強行中斷觸控事件的時候,該方法會被調(diào)用(舉例:你正在刷微博,突然有人來電,如果對該方法進行重載,那么該方法就是在此刻被調(diào)用的)
上面的每一個方法都屬于 UIResponder 方法,通常在 一個 UIView 或是 UIViewController 的子類中進行實現(xiàn)。
這些方法內(nèi)部并沒有實現(xiàn)什么功能。當(dāng)你想把觸控動作添加到應(yīng)用時,就應(yīng)該重載這些方法,實現(xiàn)自己需要的功能。
注意:在UITouchPhaseStationary 階段,沒有方法會被回調(diào)。
手勢識別器
通過手勢識別器類,當(dāng)用戶進行輕擊、縮放、旋轉(zhuǎn)、橫掃、拖動或是一個長按動作時,我們可以觸發(fā)回調(diào)方法。
幾種常見的手勢
- Taps - 輕擊,一指或多指
- Swipes - 橫掃
- Pinches - 捏縮
- Rotations - 雙指進行視圖的旋轉(zhuǎn)
- Pans - 拖拽進行平移
- Long presses - 長按
本人正在進行 iOS 開發(fā)進階學(xué)習(xí)。希望借助簡書這個平臺和志同道合的朋友一起交流,互促互進。該筆記的主體為譯文,也會有一些個人的想法和總結(jié),如有不正確或者不合理的地方,還望各位朋友指正! :)