天天看點

《iOS 6核心開發手冊(第4版)》——1.4節秘訣:同時使用多個姿勢識别器

本節書摘來自異步社群《ios 6核心開發手冊(第4版)》一書中的第1章,第1.4節秘訣:同時使用多個姿勢識别器,作者 【美】erica sadun,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

1.4 秘訣:同時使用多個姿勢識别器

ios 6核心開發手冊(第4版)

秘訣1-3建立了秘訣1-2中展示的思想,但是具有幾點差别。第一,它引入了多個識别器,它們并行工作。為了實作這一點,代碼使用3個單獨的識别器(旋轉、捏合和平移),并把它們都添加到dragview的gesturerecognizers屬性中。第二,它把dragview指定為每個識别器的委托。這允許dragview實作gesturerecognizer:shouldrecognizesimultaneouslywithgesturerecognizer:委托方法,使這些識别器能夠同時工作。在添加該方法以傳回yes作為它的值之前,一次将隻有一個識别器接管工作。使用并行的識别器允許(例如)同時進行縮放和旋轉,以響應使用者的捏合姿勢。

注意:

uitouch對象存儲一個姿勢識别器的數組。這個數組中的項目代表每個識别器,它接收正在處理的觸摸對象。當建立的視圖不帶有姿勢識别器時,将把帶有空識别器數組的觸摸傳遞給它的響應者方法。

秘訣1-3擴充了視圖的狀态,以包括縮放和旋轉執行個體變量。這些項目用于跟蹤以前的變換值,并允許代碼建構複合仿射變換。在秘訣1-3的updatetransformwithoffset:方法中建立的這些複合變換把平移、旋轉和縮放結合進單個結果中。與前一個秘訣不同,這個秘訣統一使用變換對其對象應用改變,這是識别器的标準實踐。

最後,這個秘訣引入了一個混合方法進行姿勢識别。秘訣1-3沒有向視圖的識别器數組中添加一個uitapgesturerecognizer,而是示範了如何添加秘訣1-1中使用的基本觸摸方法類型來捕獲三點按。在這個示例中,三點按将把視圖重置回一緻變換。這會撤銷以前應用于視圖的任何操作,并使其恢複原始位置、方向和大小。可以看到,觸摸開始、移動、結束和取消方法與姿勢識别器回調一起無縫地工作,這就是在這個秘訣中包括這個額外細節的意義。添加一個點按識别器同樣工作得很好。

這個秘訣示範了使用姿勢識别器與觸摸互動的簡潔性。

《iOS 6核心開發手冊(第4版)》——1.4節秘訣:同時使用多個姿勢識别器
《iOS 6核心開發手冊(第4版)》——1.4節秘訣:同時使用多個姿勢識别器

1.4.1 解決姿勢沖突

當需要同時識别多種姿勢類型時,可能會發生姿勢沖突。例如,當需要識别單點按和雙點按時會發生什麼?如果單點按識别器在第一次點按時觸發,甚至當使用者打算輸入雙點按時則會發生什麼?或者如果你等待并且僅當很清楚使用者将不會添加第二次點按之後才做出響應,則該如何?ios sdk允許在代碼中考慮這些沖突。

你的類可以指定一種姿勢必須失敗,以便使另一種姿勢獲得成功,可以調用require gesture recognizertofail:來實作這一點。這是一個姿勢方法,它接受一個參數,即另一個姿勢識别器。這個調用将在接收這條消息的對象與另一個姿勢對象之間建立一種相關性。它的含義是:為了使第一個姿勢觸發,第二個姿勢必須失敗;如果第二個姿勢被識别,那麼第一個姿勢将不會。

在實際中,這通常意味着識别器添加了一個延遲,直到它可以确信相關的識别器失敗為止。它會等到第二個識别器不再可能為止。直到那時,第一個識别器才完成。如果同時識别了單點按和雙點按,應用程式在第一次點按之後将等待稍長一點的時間;如果沒有第二次點按發生,就會觸發單點按;否則,就會觸發雙按,但不會同時觸發這二者。

你的gui響應将會放慢速度以适應這種變化。單點按響應會變得稍後滞後一些,這是由于在時間消逝之前無法辨識第二次點按是否到來。如果即時響應對于使用者體驗至關重要,那麼永遠也不應該同時使用這兩類識别器。可代之以嘗試圍繞着點按意味着“現在做某件事情”的情況進行設計,并且避免同時需要用于這些模式的兩種姿勢。

不要忘記你可以自由地添加、删除和禁用姿勢識别器。單點按可能把界面帶到某個位置,它對于進一步區分單點按和雙點按是有意義的。當保留該模式時,可以禁用或删除雙點按識别器,以重新獲得更好的單點按識别。這樣的調整将把界面減速限制于絕對需要它們的地方。

繼續閱讀