iOS手势识别的详细使用方法(拖动,缩放,旋转,点击,手势依赖,自定

2020-01-18 17:11:45于丽

多添加了一条龙的view,两个view都能接收上面的三种手势。运行效果如下:ios,手势识别,手势识别方法,ios手势识别器

7、拖动(pan手势)速度(以较快的速度拖放后view有滑行的效果)
如何实现呢?

监视手势是否结束 监视触摸的速度

- (void) handlePan:(UIPanGestureRecognizer*) recognizer 
{ 
  CGPoint translation = [recognizer translationInView:self.view]; 
  recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, 
                    recognizer.view.center.y + translation.y); 
  [recognizer setTranslation:CGPointZero inView:self.view]; 
   
  if (recognizer.state == UIGestureRecognizerStateEnded) { 
     
    CGPoint velocity = [recognizer velocityInView:self.view]; 
    CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y)); 
    CGFloat slideMult = magnitude / 200; 
    NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult); 
     
    float slideFactor = 0.1 * slideMult; // Increase for more of a slide 
    CGPoint finalPoint = CGPointMake(recognizer.view.center.x + (velocity.x * slideFactor), 
                     recognizer.view.center.y + (velocity.y * slideFactor)); 
    finalPoint.x = MIN(MAX(finalPoint.x, 0), self.view.bounds.size.width); 
    finalPoint.y = MIN(MAX(finalPoint.y, 0), self.view.bounds.size.height); 
     
    [UIView animateWithDuration:slideFactor*2 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ 
      recognizer.view.center = finalPoint; 
    } completion:nil]; 
     
  } 

代码实现解析:

计算速度向量的长度(估计大部分都忘了)这些知识了。 如果速度向量小于200,那就会得到一个小于的小数,那么滑行会很短 基于速度和速度因素计算一个终点 确保终点不会跑出父View的边界 使用UIView动画使view滑动到终点

运行后,快速拖动图像view放开会看到view还会在原来的方向滑行一段路。

8、同时触发两个view的手势

手势之间是互斥的,如果你想同时触发蛇和龙的view,那么需要实现协议

UIGestureRecognizerDelegate,


@interface ViewController : UIViewController<UIGestureRecognizerDelegate> 
@end 

并在协议这个方法里返回YES。


-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
  return YES; 
} 

 把self作为代理设置给手势:


panGestureRecognizer.delegate = self; 
pinchGestureRecognizer.delegate = self; 
rotateRecognizer.delegate = self;