關於ios的手勢識別(GestureRecognizers)講解

你們都知道,蘋果的設備,無論是mac機器仍是iPhone或iad,都支持多點觸控,進而延伸了多種手勢識別的功能。這爲用戶帶來了很大的便攜性和多樣靈活性,極大的方便了用戶的使用。足以見手勢識別(GestureRecognizers)在開發中也有舉足輕重的做用。ios

在iOS 4之前,手勢識別由開發人員負責。ui

   主要使用的是由UIResponder而來的以下4種方式:spa

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event對象

這每每須要進行復雜的數學運算才能甄別不用的手勢,蘋果意識到這種狀況的複雜性和手勢對iPhone用戶界面的重要性以後,在iOS4中加入了UIGestureRecognizer類,使開發者更容易實現各類手勢的識別。繼承

UIGestureRecognizer類是繼承自Nsobject的抽象類,它派生的6個主要子類分別詮釋了不一樣的手勢識別。ip

  • UITapGestureRecognizer – 「輕擊」手勢。能夠配置爲「單擊」和「連擊」的識別。
  • UIPinchGestureRecognizer –「捏合」手勢。該手勢一般用於縮放視圖或改變可視組件的大小。
  • UIPanGestureRecognizer – 「平移」手勢。識別拖拽或移動動做。
  • UISwipeGestureRecognizer – 「輕掃」手勢。當用戶從屏幕上劃過期識別爲該手勢。能夠指定該動做的方向(上、下、左、右)。
  • UIRotationGestureRecognizer – 「轉動」手勢。用戶兩指在屏幕上作相對環形運動。
  • UILongPressGestureRecognizer – 「長按」手勢。使用1指或多指觸摸屏幕並保持必定時間。

這些手勢識別器必需和視圖經過addGestureRecognizer:方法聯繫在一塊兒。識別器必需指定一個響應方法以便發生指定手勢時進行調用。removeGestureRecognizer:方法能夠將識別器從視圖中移出,方法參數指定要移除的識別器.開發

識別器響應消息

 iOS 4 的手勢識別器在偵測到某個手勢發生時,使用目標-動做模型去通知應用程序。當一個識別器被建立以後,只要有對應的手勢發生,就會調用建立時指定的方法。rem

 

連續和不連續手勢

 手勢分爲「連續手勢」和「不連續手勢」兩種。「不連續手勢」只會致使調用響應方法一次。「輕擊」(包括多擊)僅僅會觸發一次響應方法。而「輕掃」、「平移」、「旋轉」、「捏合」則是連續手勢,它們會接二連三地調用響應方法直到手勢結束。get

從手勢中獲取數據

每一個手勢響應方法都會被傳入一個UIGestureRecognizer* sender對象,從中能夠獲取到和手勢有關的信息。例如,對於「捏合」手勢,能夠經過這個參數獲取縮放係數、捏合速度。對於「轉動」手勢,則能夠得到轉動的次數及速度。數學

識別輕擊手勢

 輕擊手勢使用UITapGestureRecognizer類進行識別。在alloc和init時必需指定一個手勢觸發時調用的方法引用(即selector選擇器)。使用numberOfTapsRequired屬性能夠定義輕擊必需被連續操做的次數。如如下代碼所示,當識別器偵測到連續輕擊2次時,將觸發tapDetected:方法。

 

-(void) tapGestureRecognizeTest

{

    UITapGestureRecognizer *doubleTap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapDeteted:)];

    doubleTap.numberOfTapsRequired=2;

    [self.parentUiView addGestureRecognizer:doubleTap];

    [doubleTap release];

}

-(IBAction)tapDeteted:(UIGestureRecognizer *)sender

{

    NSLog(@"雙擊手勢");

}

識別捏合手勢

 

 捏合手勢使用UIPinchGestureRecognizer類識別。例如:

 

-(void) pinchGestureRecongnizeTest

{

    UIPinchGestureRecognizer *pinshGesture=[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinshDeteted:)];

    

    [self.parentUiView addGestureRecognizer:pinshGesture];

    [pinshGesture release];

}

-(IBAction)pinshDeteted:(UIGestureRecognizer *)sender

{

    NSLog(@"此觸摸手勢爲%@",@"捏合手勢");

}

識別轉動手勢

 

轉動手勢使用UIRotationGestureRecognizer類。

UIRotationGestureRecognizer *rotationRecognizer =
      [[UIRotationGestureRecognizer alloc]
      initWithTarget:self
       action:@selector(rotationDetected:)]; 
[self.view addGestureRecognizer:rotationRecognizer]; 
[rotationRecognizer release]; 
 

識別平移手勢

 

平移手勢使用UIPanGestureRecognizer 類。平移手勢是最基本的連續手勢。例如手指在屏幕上隨意亂劃能夠被識別爲平移或拖拽操做:

UIRotationGestureRecognizer *panRecognizer =
       [[UIPanGestureRecognizer alloc]
      initWithTarget:self
       action:@selector(panDetected:)]; 
[self.view addGestureRecognizer:panRecognizer]; 
[panRecognizer release]; 

若是輕掃和平移都添加在同一個view中,那麼極可能大部分輕掃手勢都會被識別爲平移。並且若是兩種手勢被添加到同一個view時,會產生一個警告。

 

識別輕掃手勢

 

輕掃手勢使用 UISwipeGestureRecognizer 類。全部的輕掃都將被識別,或者你能夠指定只偵測方向爲如下常量的輕掃:

  • UISwipeGestureRecognizerDirectionRight
  • UISwipeGestureRecognizerDirectionLeft
  • UISwipeGestureRecognizerDirectionUp
  • USwipeIGestureRecognizerDirectionDown

若是不指定direction屬性,默認只偵測方向爲右的輕掃。如下代碼設置只偵測向上輕掃:

UISwipeGestureRecognizer *swipeRecognizer =
        [[UISwipeGestureRecognizer alloc]
       initWithTarget:self
        action:@selector(swipeDetected:)]; 
swipeRecognizer.direction = UISwipeGestureRecognizerDirectionUp; [self.view addGestureRecognizer:swipeRecognizer]; 
[swipeRecognizer release]; 
 

識別長按手勢

 

長按手勢使用 UILongPressGestureRecognizer 類。這個手勢須要指定長按的時間,觸摸的次數,點擊的次數以及在觸摸過程當中是否容許移動。這些選項分別由minimumPressDuration, numberOfTouchesRequired, numberOfTapsRequired 和allowableMovement 屬性指定。如下代碼使識別器只偵測單指長按3秒以上的手勢。allowableMovement未指定,默認是容許10個像素的移動:

UILongPressGestureRecognizer *longPressRecognizer =
       [[UILongPressGestureRecognizer alloc]
      initWithTarget:self
       action:@selector(longPressDetected:)]; longPressRecognizer.minimumPressDuration = 3; 
longPressRecognizer.numberOfTouchesRequired = 1; 
[self.view addGestureRecognizer:longPressRecognizer];
[longPressRecognizer release]; 

 注:ios模擬器使用捏合手勢時,按住option鍵。而後結合鼠標模擬。 觸摸手勢說明: (1)右鍵按住+移動鼠標向左=放大; (2)右鍵按住+移動鼠標向右=縮小; (3)右鍵按住+移動鼠標向上=前傾; (4)右鍵按住+移動鼠標向下=後傾

相關文章
相關標籤/搜索