你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> IOS 開發 手勢使用

IOS 開發 手勢使用

編輯:IOS開發綜合

首先為了防止看我的博客的人剛打開就關閉,所以就先給個手勢的例子

    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapView:)];
    tapGesture.numberOfTapsRequired = 1;
    tapGesture.numberOfTouchesRequired = 1;
    [self.view addGestureRecognizer:tapGesture];

話說回來,如果直接講例子以及如何使用函數,沒多大意思,而且這種東西就成了記單詞,不好不好實在不好,了解下機理,那就不用背單詞了,不論怎樣變都無所謂了。上個博客講了事件的傳播途徑和順序。那麼本次就說說如何在這樣的大前提下,做些設置來適應特殊的需求。

首先來講一下手勢的識別和touch事件和處理手勢的target之間的關系。如下圖:


\

當用戶觸摸屏幕,會有touchbegin 事件,然後觸摸也可以移動,也會有touchmove,然後離開就會有touchend時間,總的來說touch事件有一下三個階段:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PC9wPgo8aW1nIHNyYz0="/uploadfile/Collfiles/20140417/2014041709211089.png" alt="\">
首先touchbegin ,之後用戶移動的的話會進入touchmove,然後手指離開就會有touchend,用戶也可以直接離開,就直接沖touchbegin 到tauchend。 無論哪個階段,ios都會將這些階段包裹成一個touch事件,先傳給手勢們,手勢會分析這些事件,改變自己的狀態,然後發送消息給target,target就會調用處理函數進行事件處理。什麼是手勢狀態改變。看下圖
\

這個圖是手勢的狀態遷移自動機,左邊是不連續的單一手勢,右邊是連續的手勢。 手勢剛開始默認處於possible狀態,當分析出可以識別時,單一分離手勢立馬變為recognized狀態,並發送消息給target,不識別就變為Failed,但不發消息給target。 連續的手勢,當初次識別時,其從possible變為begin狀態,然後發送消息給target,然後繼續分析touch事件,然後處於change,發送消息給target,當變化後不符合該手勢的模式時,就變為canceled狀態,但不發送消息給target,如果touch end時間來了後,就變為recognized,並發送消息給target。 總之在狀態變化的時候會發送消息給target,但變化的目標狀態是 canceled 或者 failed的話,是不發送消息給target的。還有當處於recognized(end)狀態是,ios會把手勢的狀態重新置為possible狀態,但不發消息給target。 講了這麼多下來就講如何滿足特定需求。先看一下兩個手勢的代理函數

gestureRecognizer:shouldReceiveTouch:

gestureRecognizerShouldBegin:

gestureRecognizer:shouldReceiveTouch是當iOS訪問在傳遞touch事件之前會詢問手勢的代理,問是否要傳遞touch時間給這個手勢。默認為YES,表明是傳,為NO的話,表明是不傳,不傳就表明手勢的狀態是不可能發生改變的,也就是說手勢就當什麼也沒發生過。

gestureRecognizerShouldBegin:這個就不一樣了,首先可以肯定touch事件肯定傳遞給它了,但是如果這個函數返回NO,那麼改手勢的狀態立馬為failed,這個函數有什麼用呢,當你一個view上同時加了手勢和touchend事件後,你可以在這個函數裡面做控制讓你的touchend先相應,當touchend不相應的話,你可以在這個函數裡面在做判斷,讓其返回YES,手勢就又可以用了,這個就改變了touch事件和手勢的優先級。但是這個不是說touchend不識別的時候,當前的touch事件還會傳遞給手勢,這個只是在touch時間在傳遞給view的時候,讓手勢不去過濾。

如何解決手勢沖突?

當一個view的A手勢的識別部分是B手勢識別的子部分時,默認情況下A就先識別了,B就識別不了了,如何解決這個

[A requireGestureRecognizerToFail:B];

這樣的話,就是A在識別事件之前看B的狀態,如果B是不是Fail狀態,如果不是,就等待,A的狀態依然是possible。當B是Failed的話,就開始識別。

這樣就可以滿足上述要求了。

我們都知道當touch事件發生後,ios會將事件發送給view的手勢們,但是誰先誰後是不定的,在默認情況下,先識別的的手勢會阻斷繼續傳播,如果我現在有個需求是要求兩個手勢同時識別,怎麼辦?

gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: 這個代理函數默認返回NO,也就是會識別後阻斷傳播,如果返回為YES那麼就不會阻斷繼續傳播

當我們需要在響應A手勢的時候,不響應B,但響應B的時候要相應A,怎麼辦

canPreventGestureRecognizer

canBePreventedByGestureRecognizer:

這兩個函數會講兩個手勢簡歷一個單向依賴關系,[A canPreventedByGestureRecognizer: B];

響應A手勢的時候,不響應B,但響應B的時候要相應A

這部分的使用都是基於事件是否傳播到手勢上去做的。

接下來就是,事件傳播到手勢後,手勢沒有失敗之前對事件進行過濾

當我需要在我的手勢沒有失敗之前,view不准識別任何touch event。怎麼辦

delaysTouchesBegan 默認為NO,如果設置為YES,就表明手勢沒有失敗之前,view收不到touch begin事件。

其次當iOS發出touch end的時候,手勢仍然沒有識別,但是也麼有處於失敗狀態,這個時候我們想讓view收到touch end事件,怎麼辦?

將delaysTouchesEnded設置為NO(默認為YES)

總結,有事件的傳輸路徑和次序,已經由ios規定好了,那麼以上的方法也就是在這個基礎上做的,有的事在將要通知手勢發生了touch事件前,有的事之後。總之,分析手勢的時候一定時時刻刻想到touch事件的傳播。

好了手勢的使用基本上將的差不多了,希望大家能多提意見




  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved