en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

10.28.2011

簡單判斷 Swipe 手勢劃過方向的方法

 

Swipe 手勢指的手指在畫面上快速拖曳或是擦拭的動作,這在 iOS 系統中最常被使用到的操作方式,判斷手指劃過畫面的方式可以由最基本的 UITouch 事件來獲得,UITouch 事件可以捕捉使用者對於觸碰螢幕的操作行為,像是手指觸碰畫面、手指離開畫面或是手指在畫面上移動等等,藉由綜合這些事件並做計算就可以算出手指劃過畫面的等等資訊,但是如果你的應用程式並不需要這麼複雜的手勢操作,那麼就可以考慮使用 UISwipeGestureRecognizer 來製作簡單的手勢辨識。

UISwipeGestureRecognizer 是自 iOS 3.2 就加入的手指動態辨識功能,它能辨識簡單的手指上下左右滑動方向,並且呼叫對應的函式來執行動作,使用的方法如下。

UISwipeGestureRecognizer *swipeUP;

//設定所要偵測的UIView與對應的函式
swipeUP = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)];

//設定偵測手勢的類型的(往上劃過)
[swipeUP setDirection:UISwipeGestureRecognizerDirectionUp];

//將辨識的機制加入
[self.view addGestureRecognizer:swipeUP];

上述程式碼我們建立了一個往上劃過的手勢機制,之後只要畫面出現任何符合此機制的手勢行為,就會觸發 handleSwipe: 函式,關於上下左右不同的手勢類型都被定義在 UIGestureRecognizer.h 中。

typedef enum {
    UISwipeGestureRecognizerDirectionRight = 1 << 0,
    UISwipeGestureRecognizerDirectionLeft  = 1 << 1,
    UISwipeGestureRecognizerDirectionUp    = 1 << 2,
    UISwipeGestureRecognizerDirectionDown  = 1 << 3
} UISwipeGestureRecognizerDirection;

由於使用 UISwipeGestureRecognizer 方法一次只能定義一種手勢機制,如果你的應用程式需要同時辨識上下左右不同的手勢操作,可以考慮讓它們全都呼叫一個相同的函式,並在函式中使用 Switch Case 來判斷不同的方向,做法如下。

-(void)handleSwipe:(UISwipeGestureRecognizer *)gesture {

    switch (gesture.direction) {
        case UISwipeGestureRecognizerDirectionUp:
            [tipsLabel setText:@"由下往上劃過"];
            break;

        case UISwipeGestureRecognizerDirectionDown:
            [tipsLabel setText:@"由上往下劃過"];
            break;

        case UISwipeGestureRecognizerDirectionLeft:
            [tipsLabel setText:@"由右往左劃過"];
            break;

        case UISwipeGestureRecognizerDirectionRight:
            [tipsLabel setText:@"由左往右劃過"];
            break;

        default:
            break;
    }
}


ps:如果想要獲得進行更細部的手勢資訊,像是角度劃過的速度等等還是必須透過 UITouch 來取得,關於其他的手勢資訊可以參考Touch Panel / 觸碰螢幕 / 壓力感應器的基本使用方式ㄧ文,以及Touch Panel 多點觸碰時畫面的座標取得方法ㄧ文。






4 則留言:

  1. 請問若要辨識

    "由左往右劃過、由上往下劃過、由上往下劃過、由上往下劃過、由左往右劃過"

    也可以使用Switch Case嗎??

    回覆刪除
    回覆
    1. 你好:

      是的,就像上述的 Switch Case 一樣,你可以用它來辨識是方向,
      另外,你可以在索引式搜索列表的 UIGestureRecognizer 分類中找到類似的應用。

      http://furnacedigital.blogspot.tw/search/label/C_UIGestureRecognizer

      刪除
    2. 我的理解為

      - (void)handleSwipe:(UISwipeGestureRecognizer *)gesture {
      switch (gesture.direction) {
      case UISwipeGestureRecognizerDirectionRight:
      [tipsLabel setText:@"由左往右劃過"];
      break;
      case UISwipeGestureRecognizerDirectionDown:
      [tipsLabel setText:@"由上往下劃過"];
      break;
      case UISwipeGestureRecognizerDirectionDown:
      [tipsLabel setText:@"由上往下劃過"];
      break;
      case UISwipeGestureRecognizerDirectionRight:
      [tipsLabel setText:@"由左往右劃過"];
      break;
      default:
      break;
      }
      }

      可似乎不能重覆,寫了一次的UISwipeGestureRecognizerDirectionRight
      就不能再寫UISwipeGestureRecognizerDirectionRight??

      刪除
    3. 您好:

      您對 Switch Case 的認知沒有錯,
      可是您不是要辨識那四個方向嗎?這些不是都已經包含在 Switch Case 中了,
      還是,你是要連續判斷這些動作變成一個手勢,如果是這樣你可能要寫一些 if-else,或是增加一些變數來幫助您判斷的手勢目前是到哪個階段。

      另外,手勢辨識 UIGestureRecognizer 物件伊文的最後,有提到製作自訂的手勢,也許對你有幫助,只是這部份我沒有實作過就是了。
      http://furnacedigital.blogspot.tw/2012/06/uigesturerecognizer.html

      刪除