IOS學習 UIGestureRecognizer相關

qw25767889發表於2014-11-01

UIGestureRecognizer 是一個具體手勢的基類,提供了較為簡單的手勢實現方式  

The concrete subclasses of UIGestureRecognizer are the following:

一個gesture recognizer是針對一個特定的view的(包含其subview),用UIView的方法addGestureRecognize:去關聯一個view

一個gesture recognizer是不參與UIView的事件響應鏈的

各個手勢使用時的程式碼:

UITapGestureRecognizer

  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.     // Do any additional setup after loading the view from its nib.  
  5.       
  6.     UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];  
  7.     if (![tapGesture respondsToSelector:@selector(locationInView:)]) {  
  8.         [tapGesture release];  
  9.         tapGesture = nil;  
  10.     }else {  
  11.         tapGesture.delegate = self;  
  12.         tapGesture.numberOfTapsRequired = 1; // The default value is 1.  
  13.         tapGesture.numberOfTouchesRequired = 1; // The default value is 1.  
  14.         [self.view addGestureRecognizer:tapGesture];  
  15.     }  
  16. }  

  1. - (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer  
  2. {  
  3.     UIView *view = [gestureRecognizer view]; // 這個view是手勢所屬的view,也就是增加手勢的那個view  
  4.       
  5.     switch (gestureRecognizer.state) {  
  6.         case UIGestureRecognizerStateEnded:{ // UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // 正常情況下只響應這個訊息  
  7.             NSLog(@"======UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized");  
  8.             break;  
  9.         }  
  10.         case UIGestureRecognizerStateFailed:{ //   
  11.             NSLog(@"======UIGestureRecognizerStateFailed");  
  12.             break;  
  13.         }  
  14.         case UIGestureRecognizerStatePossible:{ //   
  15.             NSLog(@"======UIGestureRecognizerStatePossible");  
  16.             break;  
  17.         }  
  18.         default:{  
  19.             NSLog(@"======Unknow gestureRecognizer");  
  20.             break;  
  21.         }  
  22.     }    
  23. }  
  24.   
  25. // 詢問一個手勢接收者是否應該開始執行一個觸控事件(控制繫結手勢時,繫結的響應函式是否執行,例:return YES執行,NO不執行)
  26. // 這個方法在touchesBegan:withEvent:之後呼叫
  27. - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{  
  28. //    CGPoint currentPoint = [gestureRecognizer locationInView:self.view];  
  29. //    if (CGRectContainsPoint(CGRectMake(0, 0, 100, 100), currentPoint) ) {  
  30. //        return YES;  
  31. //    }  
  32. //      
  33. //    return NO;  
  34.       
  35.     return YES;  
  36. }  
  37.   
  38. // 詢問delegate,兩個手勢是否同時接收訊息,返回YES同事接收。返回NO,不同是接收(如果另外一個手勢返回YES,則並不能保證不同時接收訊息)the default implementation returns NO。  
  39. // 這個函式一般在一個手勢接收者要阻止另外一個手勢接收自己的訊息的時候呼叫  
  40. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{  
  41.     return NO;  
  42. }  
  43.   
  44. // 詢問delegate是否允許手勢接收者接收一個touch物件  
  45. // 返回YES,則允許對這個touch物件稽核,NO,則不允許。  
  46. // 這個方法在touchesBegan:withEvent:之前呼叫,為一個新的touch物件進行呼叫  
  47. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{  
  48. //備註1:xcode會顯示return NO和之後的return YES等都會走,但是實際執行的只有第一個return NO;
  49. //備註2:返回YES則響應,返回NO則不響應,可以都不響應。
  50.     if ([touch.view isKindOfClass:[UIButton class]])

        {

           return NO;

        }

       else

        {

           return YES;

        }


  51.     return YES;  
  52. }  


UIScrollView在SubView繫結代理後(繫結的UIGestureRecognizer單擊)先點選再滑動scrollview,可以通過scrollView的屬性設定允許發“取消事件”,UIGestureRecognizer的屬性設定允許接受“取消事件”,達到泡泡點選不影響滑動.

相關文章