天天看點

《iOS 6核心開發手冊(第4版)》——1.13節秘訣:從滾動視圖中拖動

本節書摘來自異步社群《ios 6核心開發手冊(第4版)》一書中的第1章,第1.13節秘訣:從滾動視圖中拖動,作者 【美】erica sadun,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

1.13 秘訣:從滾動視圖中拖動

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

ios的豐富的姿勢識别器集并不總是能夠準确地實作你想要達到的目标。下面舉一個例子。設想一個水準滾動的視圖,其中一個接一個地填充圖像視圖,是以可以左右滾動,檢視完整的集合。現在,設想你希望能夠把項目拖出那個視圖,并把它們添加到滾動區域下面的空間中。為此,需要識别那些子視圖上向下的觸摸(也就是說,垂直于滾動的方向)。

這是我在嘗試幫助開發人員alex hosgrove時所遇到的一道難題,他嘗試建構一個應用程式,它粗略等價于一組冰箱磁貼字母,使用者可以把那些字母向下拖動到工作區中,然後處理并排列他們所選的項目。這種情況有兩個挑戰。第一,誰擁有每個觸摸?第二,在識别向下的觸摸之後會發生什麼?

滾動視圖及其子視圖都擁有每個觸摸中感興趣的方面。向下的姿勢應該生成新對象,橫向的姿勢應該會平移滾動視圖。觸摸必須共享,以允許滾動視圖及其子視圖響應使用者互動。可以使用姿勢委托解決這個問題。

姿勢委托允許添加同時的識别,是以兩個識别器可以同時工作。可以通過聲明一個協定(uigesturerecognizerdelegate)并添加一個簡單的委托方法來添加這種行為。

不能為滾動視圖重新指定姿勢委托,是以必須把這個委托重寫添加到用于滾動視圖的子視圖的實作中。

第二個問題(即把輕掃轉換為拖動)是通過考慮整個觸摸生存期來解決的。每個建立新對象的觸摸都開始于一個有向的拖動,但是一旦建立了新視圖,就是作為平移結束的。平移識别器在這裡比輕掃識别器工作得更好,後者的生存期結束于識别那個時刻。

為了使之發生,秘訣1-12在内置的姿勢檢測外面手動添加了那個有向移動檢測。最終,這種開箱即用的方法提供了重大的編碼收益。這是由于一旦檢測到輕掃,底層的平移姿勢識别器就會繼續工作。這允許使用者保持移動被輕掃的對象,而不必擡起手指,并重新觸摸正在處理的對象。

這種實作檢測在垂直方向上至少下移16像素的輕掃,而不會向任何一邊偏離超過8像素。當這段代碼檢測到一個向下的輕掃時,它會向螢幕上添加一個新的dragview(本章前面使用的相同的類),并且允許它為剩餘的平移姿勢互動沿着觸摸前進。

在識别時,類将把它自身标記為處理了輕掃(gesturewashandled),并且會在平移事件期間禁用滾動視圖。這允許子視圖完全控制正在進行的平移姿勢,而無須滾動視圖對進一步的觸摸移動做出反應。

《iOS 6核心開發手冊(第4版)》——1.13節秘訣:從滾動視圖中拖動
《iOS 6核心開發手冊(第4版)》——1.13節秘訣:從滾動視圖中拖動

繼續閱讀