`
anlulu
  • 浏览: 43430 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ios手势

阅读更多

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. // 询问一个手势接收者是否应该开始解释执行一个触摸接收事件  
  26. - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{  
  27. //    CGPoint currentPoint = [gestureRecognizer locationInView:self.view];  
  28. //    if (CGRectContainsPoint(CGRectMake(0, 0, 100, 100), currentPoint) ) {  
  29. //        return YES;  
  30. //    }  
  31. //      
  32. //    return NO;  
  33.       
  34.     return YES;  
  35. }  
  36.   
  37. // 询问delegate,两个手势是否同时接收消息,返回YES同事接收。返回NO,不同是接收(如果另外一个手势返回YES,则并不能保证不同时接收消息)the default implementation returns NO。  
  38. // 这个函数一般在一个手势接收者要阻止另外一个手势接收自己的消息的时候调用  
  39. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{  
  40.     return NO;  
  41. }  
  42.   
  43. // 询问delegate是否允许手势接收者接收一个touch对象  
  44. // 返回YES,则允许对这个touch对象审核,NO,则不允许。  
  45. // 这个方法在touchesBegan:withEvent:之前调用,为一个新的touch对象进行调用  
  46. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{  
  47.     return YES;  
  48. }  

 

 

UIPinchGestureRecognizer

 

  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.     // Do any additional setup after loading the view from its nib.  
  5.       
  6.     UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];  
  7.     if (![pinchGesture respondsToSelector:@selector(locationInView:)]) {  
  8.         [pinchGesture release];  
  9.         pinchGesture = nil;  
  10.     }else {  
  11.         pinchGesture.delegate = self;  
  12.         [self.view addGestureRecognizer: pinchGesture];  
  13.     }    
  14. }  
  15.   
  16.   
  17. - (void)handleGesture:(UIPinchGestureRecognizer *)gestureRecognizer  
  18. {  
  19.       
  20.     UIView *view = [gestureRecognizer view]; // 这个view是手势所属的view,也就是增加手势的那个view  
  21.       
  22.       
  23.     /* 
  24.      scale属性: 可以理解为两手指之间的距离,其实是个比例,相对距离,不是绝对距离 
  25.                 以刚开始的两个手指对应的两个point的之间的距离为标准,此时scale=1. 
  26.                 若两手指之间距离减小,则scale不断变小,当两指重合,则变为0 
  27.                 若两手指之间距离变大,则scale不断增大,没有上限,看屏幕多大 
  28.       
  29.      velocity属性: 可以理解为两手指之间的移动速度,其实是个速度比例,相对速度,不是绝对速度 
  30.                 以刚开始的两个手指对应的两个point的之间的距离为标准,此时velocity=0. 
  31.                 若两手指之间距离减小,则velocity为负数,从-0开始,随着手指向里捏合的速度越快,负值越大,没有上限,我测试了下,可以到-20.009099,甚至更大 
  32.                 若两手指之间距离变大,则velocity不断正数,没有上限,从0开始,随着手指向外捏合的速度越快,值越大,没有上限,我测试了下,可以到170.234663,甚至更大 
  33.                 注意:在这个过程中,出现了nan值。  
  34.                      有关NAN值的介绍如下:(http://www.cnblogs.com/konlil/archive/2011/07/06/2099646.html) 
  35.       
  36.      浮点异常值:NAN,QNAN,SNAN 
  37.       
  38.      32位浮点数在机器中的表示按照IEEE的标准是这样的: 
  39.      +------+----------------+-------------------------------+    
  40.      | 1bit    |   8bit               |         23bit                            |    
  41.      +------+----------------+-------------------------------+ 
  42.      其中:1bit表示符号位(0表示正,1表示负),8bit表示指数(0~255,实际指数取值还要减去127,即指数取值区间为-127~128),23bit表示尾数。 
  43.      这里所要说的浮点异常值就是这种表示产生的几种特殊值,IEEE规定根据指数和尾数的不同分别可表示如下几种特殊值: 
  44.      1. 零值:按上述的浮点表述形式如果指数部分全部为0,并且尾数全部为0,则表示为浮点0.0,并且规定-0 = +0 
  45.      2. 非规格化值:如果指数全部为0,尾数非0,则表示非规格化的值,16进制看到的就是[80xxxxxx]h或者[00xxxxxx]h 
  46.      3. 无穷值:如果指数全部为1,尾数全部为0,则根据符号位分别表示正无穷大和负无穷大,16进制看到的就是[FF800000]h或者[7F800000]h 
  47.      4. NAN:主角来了,如果指数全部为1,尾数非0,则表示这个值不是一个真正的值(Not A Number)。NAN又分成两类:QNAN(Quiet NAN)和SNAN(Singaling NAN)。QNAN与SNAN的不同之处在于,QNAN的尾数部分最高位定义为1,SNAN最高位定义为0;QNAN一般表示未定义的算术运算结果,最常见的莫过于除0运算;SNAN一般被用于标记未初始化的值,以此来捕获异常。 
  48.      那么既然NAN不是一个真实的数值,在程序如何判断变量是否变成了NAN呢?大部分语言中针对NAN值都有一系列的函数定义,C语言中最常见的三个函数: 
  49.      _isnan(double x);                  //判断是否为NAN 
  50.      _finite(double x);                  //判读是否为无穷大 
  51.      _fpclass(double x);                //返回一系列的定义值,如:_FPCLASS_QNAN, _FPCLASS_SNAN,具体参考MSDN 
  52.  
  53.      */  
  54.     CGFloat scale = gestureRecognizer.scale;  
  55.     NSLog(@"======scale: %f", scale);  
  56.       
  57.     CGFloat velocity = gestureRecognizer.velocity;  
  58.     NSLog(@"======scvelocityale: %f", velocity);  
  59.       
  60.     /* 
  61.      捏合手势 
  62.       
  63.      这个一般情况下只响应 
  64.      UIGestureRecognizerStateBegan、 
  65.      UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized、 
  66.      UIGestureRecognizerStateChanged消息, 
  67.      一个UIGestureRecognizerStateBegan,接下去是N多的UIGestureRecognizerStateChanged,scale的值此时会不断的变化,当手指离开时,响应UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized 
  68.      */  
  69.     switch (gestureRecognizer.state) {  
  70.         case UIGestureRecognizerStateEnded:{ // UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded  
  71.             NSLog(@"======UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized");  
  72.             break;  
  73.         }  
  74.         case UIGestureRecognizerStateBegan:{ //   
  75.             NSLog(@"======UIGestureRecognizerStateBegan");  
  76.             break;  
  77.         }  
  78.         case UIGestureRecognizerStateChanged:{ //   
  79.             NSLog(@"======UIGestureRecognizerStateChanged");  
  80.               
  81.             gestureRecognizer.view.transform = CGAffineTransformScale(gestureRecognizer.view.transform, gestureRecognizer.scale, gestureRecognizer.scale);  
  82.             gestureRecognizer.scale = 1; // 重置,很重要!!!  
  83.               
  84.             break;  
  85.         }  
  86.         case UIGestureRecognizerStateCancelled:{ //   
  87.             NSLog(@"======UIGestureRecognizerStateCancelled");  
  88.             break;  
  89.         }  
  90.         case UIGestureRecognizerStateFailed:{ //   
  91.             NSLog(@"======UIGestureRecognizerStateFailed");  
  92.             break;  
  93.         }  
  94.         case UIGestureRecognizerStatePossible:{ //   
  95.             NSLog(@"======UIGestureRecognizerStatePossible");  
  96.             break;  
  97.         }  
  98.         default:{  
  99.             NSLog(@"======Unknow gestureRecognizer");  
  100.             break;  
  101.         }  
  102.     }    
  103. }  

 

 

UIRotationGestureRecognizer

 

  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.     // Do any additional setup after loading the view from its nib.  
  5.     UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];  
  6.     if (![rotationGesture respondsToSelector:@selector(locationInView:)]) {  
  7.         [rotationGesture release];  
  8.         rotationGesture = nil;  
  9.     }else {  
  10.         rotationGesture.delegate = self;  
  11.           
  12.         [self.view addGestureRecognizer:rotationGesture];  
  13.     }  
  14. }  
  15.   
  16.   
  17. - (void)handleGesture:(UIRotationGestureRecognizer *)gestureRecognizer  
  18. {  
  19.     UIView *view = [gestureRecognizer view]; // 这个view是手势所属的view,也就是增加手势的那个view  
  20.       
  21.       
  22.     /* 
  23.      rotation属性: 可以理解为两手指之间的旋转的角度,其实是个比例,相对角度,不是绝对角度 
  24.      以刚开始的两个手指对应的两个point的之间的那条直线为标准,此时rotation=1. 
  25.      向顺时针旋转,则rotation为正数且不断变大,当旋转360度时,rotation大概为6左右,如果继续顺时针旋转,则角度会不断增加,两圈为12左右,此时若逆时针旋转,角度则不断变小 
  26.      向逆时针旋转,则rotation为负数且不断变小,当旋转360度时,rotation大概为-6左右 
  27.       
  28.      velocity属性: 可以理解为两手指之间的移动速度,其实是个速度比例,相对速度,不是绝对速度 
  29.      以刚开始的两个手指对应的两个point的之间的距离为标准,此时velocity=0. 
  30.      若两手指向顺时针旋转,则velocity为正数,从0开始,随着手指向里捏合的速度越快,值越大,没有上限 
  31.      若两手指向逆时针旋转,则velocity为负数数,没有上限,从-0开始,随着手指向外捏合的速度越快,值越小,没有上限 
  32.      */  
  33.     CGFloat rotation = gestureRecognizer.rotation;  
  34.     NSLog(@"===rotation: %f", rotation);  
  35.       
  36.     CGFloat velocity = gestureRecognizer.velocity;  
  37.     NSLog(@"======velocity: %f", velocity);  
  38.       
  39.       
  40.       
  41.     /* 
  42.      旋转手势 
  43.       
  44.      这个一般情况下只响应 
  45.      UIGestureRecognizerStateBegan、 
  46.      UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized、 
  47.      UIGestureRecognizerStateChanged消息, 
  48.      一个UIGestureRecognizerStateBegan,接下去是N多的UIGestureRecognizerStateChanged,scale的值此时会不断的变化,当手指离开时,响应UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized 
  49.      */  
  50.     switch (gestureRecognizer.state) {  
  51.         case UIGestureRecognizerStateEnded:{ // UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded  
  52.             NSLog(@"======UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized");  
  53.             break;  
  54.         }  
  55.         case UIGestureRecognizerStateBegan:{ //   
  56.             NSLog(@"======UIGestureRecognizerStateBegan");  
  57.             break;  
  58.         }  
  59.         case UIGestureRecognizerStateChanged:{ //   
  60.             NSLog(@"======UIGestureRecognizerStateChanged");  
  61.               
  62.             gestureRecognizer.view.transform = CGAffineTransformRotate(gestureRecognizer.view.transform, gestureRecognizer.rotation);  
  63.             gestureRecognizer.rotation = 0; // 重置 这个相当重要!!!   
  64.               
  65.             break;  
  66.         }  
  67.         case UIGestureRecognizerStateCancelled:{ //   
  68.             NSLog(@"======UIGestureRecognizerStateCancelled");  
  69.             break;  
  70.         }  
  71.         case UIGestureRecognizerStateFailed:{ //   
  72.             NSLog(@"======UIGestureRecognizerStateFailed");  
  73.             break;  
  74.         }  
  75.         case UIGestureRecognizerStatePossible:{ //   
  76.             NSLog(@"======UIGestureRecognizerStatePossible");  
  77.             break;  
  78.         }  
  79.         default:{  
  80.             NSLog(@"======Unknow gestureRecognizer");  
  81.             break;  
  82.         }  
  83.     }    
  84. }  

 

UISwipeGestureRecognizer

 

  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.     // Do any additional setup after loading the view from its nib.  
  5.       
  6.     /* 
  7.      同一个手势只能指定一个方向,不能同时指定多个方向,要指定多个方向 必须用多个手势 
  8.      */  
  9.       
  10.     // right  
  11.     UISwipeGestureRecognizer *swipeGestureRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];  
  12.     if (![swipeGestureRight respondsToSelector:@selector(locationInView:)]) {  
  13.         [swipeGestureRight release];  
  14.         swipeGestureRight = nil;  
  15.     }else {  
  16.         swipeGestureRight.delegate = self;  
  17.         swipeGestureRight.numberOfTouchesRequired = 1;// 手指个数 The default value is 1.  
  18.         swipeGestureRight.direction = UISwipeGestureRecognizerDirectionRight;// 同一个手势只能指定一个方向,不能同时指定多个方向,要指定多个方向 必须用多个手势  
  19.         [self.view addGestureRecognizer:swipeGestureRight];  
  20.     }  
  21.       
  22.     // left  
  23.     UISwipeGestureRecognizer *swipeGestureLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];  
  24.     if (![swipeGestureLeft respondsToSelector:@selector(locationInView:)]) {  
  25.         [swipeGestureLeft release];  
  26.         swipeGestureLeft = nil;  
  27.     }else {  
  28.         swipeGestureLeft.delegate = self;  
  29.         swipeGestureLeft.numberOfTouchesRequired = 1;// 手指个数 The default value is 1.  
  30.         swipeGestureLeft.direction = UISwipeGestureRecognizerDirectionLeft;// 同一个手势只能指定一个方向,不能同时指定多个方向,要指定多个方向 必须用多个手势  
  31.         [self.view addGestureRecognizer:swipeGestureLeft];  
  32.     }  
  33.       
  34.     // Up  
  35.     UISwipeGestureRecognizer *swipeGestureUp = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];  
  36.     if (![swipeGestureUp respondsToSelector:@selector(locationInView:)]) {  
  37.         [swipeGestureUp release];  
  38.         swipeGestureUp = nil;  
  39.     }else {  
  40.         swipeGestureUp.delegate = self;  
  41.         swipeGestureUp.numberOfTouchesRequired = 1;// 手指个数 The default value is 1.  
  42.         swipeGestureUp.direction = UISwipeGestureRecognizerDirectionUp;// 同一个手势只能指定一个方向,不能同时指定多个方向,要指定多个方向 必须用多个手势  
  43.         [self.view addGestureRecognizer:swipeGestureUp];  
  44.     }  
  45.       
  46.     // Down  
  47.     UISwipeGestureRecognizer *swipeGestureDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];  
  48.     if (![swipeGestureDown respondsToSelector:@selector(locationInView:)]) {  
  49.         [swipeGestureDown release];  
  50.         swipeGestureDown = nil;  
  51.     }else {  
  52.         swipeGestureDown.delegate = self;  
  53.         swipeGestureDown.numberOfTouchesRequired = 1;// 手指个数 The default value is 1.  
  54.         swipeGestureDown.direction = UISwipeGestureRecognizerDirectionDown;// 同一个手势只能指定一个方向,不能同时指定多个方向,要指定多个方向 必须用多个手势  
  55.         [self.view addGestureRecognizer:swipeGestureDown];  
  56.     }  
  57. }  
  58.   
  59. - (void)handleGesture:(UISwipeGestureRecognizer *)gestureRecognizer  
  60. {  
  61.     UIView *view = [gestureRecognizer view]; // 这个view是手势所属的view,也就是增加手势的那个view  
  62.       
  63.     /* 
  64.      direction属性: 用来指明手势滑动的方向的。 
  65.      */  
  66.     UISwipeGestureRecognizerDirection direction = gestureRecognizer.direction;  
  67.     switch (direction) {  
  68.         case UISwipeGestureRecognizerDirectionRight:  
  69.         {  
  70.             NSLog(@"direction==UISwipeGestureRecognizerDirectionRight");  
  71.             break;  
  72.         }  
  73.         case UISwipeGestureRecognizerDirectionLeft:  
  74.         {  
  75.             NSLog(@"direction==UISwipeGestureRecognizerDirectionLeft");  
  76.             break;  
  77.         }  
  78.         case UISwipeGestureRecognizerDirectionUp:  
  79.         {  
  80.             NSLog(@"direction==UISwipeGestureRecognizerDirectionUp");  
  81.             break;  
  82.         }  
  83.         case UISwipeGestureRecognizerDirectionDown:  
  84.         {  
  85.             NSLog(@"direction==UISwipeGestureRecognizerDirectionDown");  
  86.             break;  
  87.         }  
  88.         default:  
  89.             break;  
  90.     }  
  91.       
  92.       
  93.     /* 
  94.      轻扫手势 
  95.       
  96.      这个一般情况下只响应UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized 
  97.      */  
  98.     switch (gestureRecognizer.state) {  
  99.         case UIGestureRecognizerStateEnded:{ // UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded  
  100.             NSLog(@"======UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized");  
  101.             break;  
  102.         }  
  103.         default:{  
  104.             NSLog(@"======Unknow gestureRecognizer");  
  105.             break;  
  106.         }  
  107.     }    
  108. }  

 

 

UIPanGestureRecognizer

 

  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.     // Do any additional setup after loading the view from its nib.  
  5.       
  6.     UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];  
  7.     view.backgroundColor = [UIColor blueColor];  
  8.     [self.view addSubview:view];  
  9.       
  10.       
  11.     UIPanGestureRecognizer *panPressGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];  
  12.     if (![panPressGesture respondsToSelector:@selector(locationInView:)]) {  
  13.         [panPressGesture release];  
  14.         panPressGesture = nil;  
  15.     }else {  
  16.         panPressGesture.delegate = self;  
  17.         panPressGesture.maximumNumberOfTouches = NSUIntegerMax;// The default value is NSUIntegerMax.   
  18.         /* 
  19.          NSUIntegerMax : The maximum value for an NSUInteger. 
  20.          */  
  21.         panPressGesture.minimumNumberOfTouches = 1;// The default value is 1.  
  22.         [view addGestureRecognizer:panPressGesture];  
  23.     }  
  24. }  
  25.   
  26. // 拖拽手势  
  27. - (void)handleGesture:(UIPanGestureRecognizer *)gestureRecognizer  
  28. {  
  29.     UIView *view = [gestureRecognizer view]; // 这个view是手势所属的view,也就是增加手势的那个view  
  30.   
  31.       
  32.       
  33.     switch (gestureRecognizer.state) {  
  34.         case UIGestureRecognizerStateBegan:{   
  35.             NSLog(@"======UIGestureRecognizerStateBegan");  
  36.             break;  
  37.         }  
  38.         case UIGestureRecognizerStateChanged:{   
  39.             NSLog(@"======UIGestureRecognizerStateChanged");  
  40.               
  41.             /* 
  42.              让view跟着手指移动 
  43.               
  44.              1.获取每次系统捕获到的手指移动的偏移量translation 
  45.              2.根据偏移量translation算出当前view应该出现的位置 
  46.              3.设置view的新frame 
  47.              4.将translation重置为0(十分重要。否则translation每次都会叠加,很快你的view就会移除屏幕!) 
  48.              */  
  49.               
  50.             CGPoint translation = [gestureRecognizer translationInView:self.view];  
  51.             view.center = CGPointMake(gestureRecognizer.view.center.x + translation.x, gestureRecognizer.view.center.y + translation.y);  
  52.             [gestureRecognizer setTranslation:CGPointMake(0, 0) inView:self.view];//  注意一旦你完成上述的移动,将translation重置为0十分重要。否则translation每次都会叠加,很快你的view就会移除屏幕!  
  53.             break;  
  54.         }  
  55.         case UIGestureRecognizerStateCancelled:{   
  56.             NSLog(@"======UIGestureRecognizerStateCancelled");  
  57.             break;  
  58.         }  
  59.         case UIGestureRecognizerStateFailed:{   
  60.             NSLog(@"======UIGestureRecognizerStateFailed");  
  61.             break;  
  62.         }  
  63.         case UIGestureRecognizerStatePossible:{   
  64.             NSLog(@"======UIGestureRecognizerStatePossible");  
  65.             break;  
  66.         }  
  67.         case UIGestureRecognizerStateEnded:{ // UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded  
  68.               
  69.             /* 
  70.              当手势结束后,view的减速缓冲效果 
  71.               
  72.              模拟减速写的一个很简单的方法。它遵循如下策略: 
  73.              计算速度向量的长度(i.e. magnitude) 
  74.              如果长度小于200,则减少基本速度,否则增加它。 
  75.              基于速度和滑动因子计算终点 
  76.              确定终点在视图边界内 
  77.              让视图使用动画到达最终的静止点 
  78.              使用“Ease out“动画参数,使运动速度随着时间降低 
  79.              */  
  80.               
  81.             NSLog(@"======UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized");  
  82.               
  83.             CGPoint velocity = [gestureRecognizer velocityInView:self.view];// 分别得出x,y轴方向的速度向量长度(velocity代表按照当前速度,每秒可移动的像素个数,分xy轴两个方向)  
  84.             CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y));// 根据直角三角形的算法算出综合速度向量长度  
  85.               
  86.             // 如果长度小于200,则减少基本速度,否则增加它。  
  87.             CGFloat slideMult = magnitude / 200;  
  88.               
  89.             NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult);  
  90.             float slideFactor = 0.1 * slideMult; // Increase for more of a slide  
  91.               
  92.             // 基于速度和滑动因子计算终点  
  93.             CGPoint finalPoint = CGPointMake(view.center.x + (velocity.x * slideFactor),  
  94.                                              view.center.y + (velocity.y * slideFactor));  
  95.               
  96.             // 确定终点在视图边界内  
  97.             finalPoint.x = MIN(MAX(finalPoint.x, 0), self.view.bounds.size.width);  
  98.             finalPoint.y = MIN(MAX(finalPoint.y, 0), self.view.bounds.size.height);  
  99.               
  100.             [UIView animateWithDuration:slideFactor*2 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{  
  101.                 view.center = finalPoint;    
  102.             } completion:nil];  
  103.               
  104.             break;  
  105.         }  
  106.         default:{  
  107.             NSLog(@"======Unknow gestureRecognizer");  
  108.             break;  
  109.         }  
  110.     }    
  111. }  

 

 

UILongPressGestureRecognizer

 

  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.     // Do any additional setup after loading the view from its nib.  
  5.     UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];  
  6.     if (![longPressGesture respondsToSelector:@selector(locationInView:)]) {  
  7.         [longPressGesture release];  
  8.         longPressGesture = nil;  
  9.     }else {  
  10.         longPressGesture.delegate = self;  
  11.         longPressGesture.numberOfTapsRequired = 0;      // The default number of taps is 0.  
  12.         longPressGesture.minimumPressDuration = 0.1f;    // The default duration is is 0.5 seconds.  
  13.         longPressGesture.numberOfTouchesRequired = 1;   // The default number of fingers is 1.  
  14.         longPressGesture.allowableMovement = 10;        // The default distance is 10 pixels.  
  15.         [self.view addGestureRecognizer:longPressGesture];  
  16.     }  
  17. }  
  18.   
  19.   
  20. - (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer  
  21. {  
  22.     UIView *view = [gestureRecognizer view]; // 这个view是手势所属的view,也就是增加手势的那个view  
  23.       
  24.     switch (gestureRecognizer.state) {  
  25.         case UIGestureRecognizerStateEnded:{ // UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded  
  26.             NSLog(@"======UIGestureRecognizerStateEnded || UIGestureRecognizerStateRecognized");  
  27.             break;  
  28.         }  
  29.         case UIGestureRecognizerStateBegan:{ //   
  30.             NSLog(@"======UIGestureRecognizerStateBegan");  
  31.             break;  
  32.         }  
  33.         case UIGestureRecognizerStateChanged:{ //   
  34.             NSLog(@"======UIGestureRecognizerStateChanged");  
  35.             break;  
  36.         }  
  37.         case UIGestureRecognizerStateCancelled:{ //   
  38.             NSLog(@"======UIGestureRecognizerStateCancelled");  
  39.             break;  
  40.         }  
  41.         case UIGestureRecognizerStateFailed:{ //   
  42.             NSLog(@"======UIGestureRecognizerStateFailed");  
  43.             break;  
  44.         }  
  45.         case UIGestureRecognizerStatePossible:{ //   
  46.             NSLog(@"======UIGestureRecognizerStatePossible");  
  47.             break;  
  48.         }  
  49.         default:{  
  50.             NSLog(@"======Unknow gestureRecognizer");  
  51.             break;  
  52.         }  
  53.     }    
  54. }  
  55.   
  56. // 询问一个手势接收者是否应该开始解释执行一个触摸接收事件  
  57. - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{  
  58.     CGPoint currentPoint = [gestureRecognizer locationInView:self.view];  
  59.     if (CGRectContainsPoint(CGRectMake(0, 0, 100, 100), currentPoint) ) {  
  60.         return YES;  
  61.     }  
  62.       
  63.     return NO;  
  64. }  
  65.   
  66. // 询问delegate,两个手势是否同时接收消息,返回YES同事接收。返回NO,不同是接收(如果另外一个手势返回YES,则并不能保证不同时接收消息)the default implementation returns NO。  
  67. // 这个函数一般在一个手势接收者要阻止另外一个手势接收自己的消息的时候调用  
  68. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{  
  69.     return NO;  
  70. }  
  71.   
  72. // 询问delegate是否允许手势接收者接收一个touch对象  
  73. // 返回YES,则允许对这个touch对象审核,NO,则不允许。  
  74. // 这个方法在touchesBegan:withEvent:之前调用,为一个新的touch对象进行调用  
  75. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{  
  76.     return YES;  
  77. }  
分享到:
评论

相关推荐

    ios手势图形解锁完整Demo

    本Demo,"ios手势图形解锁完整Demo",提供了一个实现这一功能的实例,使得开发者可以快速理解和应用这种技术。 一、手势图形解锁原理 手势图形解锁的核心原理是利用触摸屏设备的多点触控能力,记录用户在预设画布上...

    IOS手势解锁

    **iOS手势解锁详解** 在iOS操作系统中,手势解锁是一种安全且直观的设备解锁方式,它允许用户通过在触摸屏上绘制特定的图案来解锁设备。本文将深入探讨iOS手势解锁的功能、工作原理以及如何实现这一功能。 ### 一...

    iOS手势集合

    iOS手势主要包括基本手势、复合手势以及自定义手势。 1. 基本手势: - `UIPanGestureRecognizer`: 平移手势,用于检测用户在屏幕上进行的平移操作。 - `UIPinchGestureRecognizer`: 捏合手势,用于识别用户的手指...

    ios手势操作演示

    本项目"ios手势操作演示"是一个使用Swift编写的示例,旨在帮助开发者理解和应用iOS中的手势识别技术。 Swift是Apple为iOS、macOS、watchOS和tvOS平台推出的一种强大且易学的编程语言,它具有现代编程语言的特点,如...

    iOS手势(全)

    在iOS平台上,手势是用户与设备交互的重要方式,它们提供了直观、自然的界面操作体验。以下是对iOS中主要手势的详细解析: 1. **轻拍(Tap)**: 轻拍是最基本的手势,通常用于选择或激活某个元素。用户只需短暂地...

    iOS手势返回上一级

    总的来说,“iOS手势返回上一级”是iOS用户体验的关键组成部分,开发者需要充分理解和掌握其工作原理,以便在应用中实现高效、流畅的导航。通过自定义和优化手势,可以进一步提升应用的用户满意度。

    ios手势的用法

    iOS中各种手势的详细用法,包括冲突手势的区分

    ios手势相关资料

    以下是一些关于iOS手势的重要知识点: 1. **UIGestureRecognizer**: 这是iOS中的主要手势类,它提供了一个框架,用于识别并响应各种触摸事件。UIGestureRecognizer有多种子类,如UIPanGestureRecognizer(拖动)、...

    ios 手势解锁实现

    本文将详细解析如何使用Objective-C实现一个iOS手势解锁功能,并基于提供的"GesturePass"压缩包文件进行讲解。 首先,手势解锁的核心在于识别用户在触屏上绘制的特定图案。在Objective-C中,我们可以利用`...

    ios手势代码demo大全

    ios 手势代码 demo 大全 ios手势代码demo大全

    iOS手势代码(旋转、缩放、拖拽等)

    iOS手势识别为开发者提供了丰富的用户交互可能性。通过`UIGestureRecognizer`及其子类,我们可以轻松地添加点击、双击、旋转、缩放和拖拽等手势到应用中,从而提升用户体验。在实际项目中,根据需求调整手势的灵敏度...

    IOS 手势锁屏

    本文将深入探讨iOS手势锁屏的相关知识点。 首先,我们要了解手势解锁的工作原理。手势锁屏是基于触摸屏设备的多点触控技术,用户在预设的解锁区域内绘制特定的轨迹,系统会记录并识别这个轨迹作为解锁密码。当用户...

    ios手势解锁相关代码_很好.zip

    这个压缩包“ios手势解锁相关代码_很好.zip”很可能包含了一个实现这一功能的示例项目,名为“GestureLockDemo”。下面,我们将深入探讨iOS手势解锁背后的技术细节、实现方法以及相关的编程知识点。 首先,我们要...

    ios手势程序

    在这个"ios手势程序"中,我们将会探讨以下几个基本的手势实现: 1. **轻扫(Swipe)手势**: 文件名:`DroppableView_10826.zip` 轻扫手势允许用户通过快速滑动手指来触发特定的事件。在iOS中,有两种主要类型的...

    iOS 手势密码 源码

    总之,这个手势密码源码提供了了解和学习iOS手势验证机制的良好机会。开发者可以借此深入理解触摸事件处理、自定义视图绘制以及用户交互设计等方面的知识,同时也可以根据自身项目需求进行相应的扩展和优化。

    IOS应用源码之IOS手势滑动截屏.zip

    这个“iOS应用源码之iOS手势滑动截屏”压缩包中包含的资源,显然是一份用于实现这一功能的源代码。这份源码可以帮助开发者深入了解如何在自己的iOS应用中集成手势识别和屏幕截图的机制,提升用户体验。 首先,我们...

    iOS 手势密码,很实用的一个库.zip

    在iOS平台上,GesturePassword是基于Swift语言实现的一个开源项目,旨在为开发者提供一种简单的方法来集成手势密码功能。这个库使得用户可以自定义图形密码,如绘制特定形状或连接多个点,从而提高用户体验并增强...

    ios拖动手势展开菜单栏

    首先,我们来讨论iOS手势识别。iOS系统支持多种内置手势,如轻触(Tap)、滑动(Swipe)、捏合(Pinch)、旋转(Rotate)以及拖放(Drag & Drop)。在本例中,主要涉及的是滑动手势(Swipe gesture),尤其是水平...

    ios 手势右滑视觉差 效果类似微信QQ等返回操作

    在iOS应用开发中,手势识别和导航控制是用户体验的关键组成部分。标题提到的“ios 手势右滑视觉差 效果类似微信QQ等返回操作”是iOS应用中常见的一种交互设计,模仿了如微信、QQ等流行应用的交互模式,为用户提供更...

    ios手势和触摸代码完整版.7z

    这份"ios手势和触摸代码完整版.7z"资源很可能是包含了实现这些功能的各种示例代码,帮助开发者深入理解和实践。 首先,我们要了解iOS中的基本触摸事件。iOS设备的屏幕可以检测到多个触摸点,这些触摸事件主要分为...

Global site tag (gtag.js) - Google Analytics