UIGestureRecognizer手势。

常用手势处理联合使用时候注意两个点,是否共存 和 正确识别哪一个。 代码参考,添加有要点注释,系统提供手势有6种:

tap 点击(可以设置单击双击等),longPress长按,Rotation 旋转,pan慢速拖动,swipe快速拖动,pinch缩放 

{

     UIView *View

            UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGestureRecognizer:)];

            [pinchGesture setDelegate:self];

            UIRotationGestureRecognizer *rotateGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationGestureRecognizer:)];

            [rotateGesture setDelegate:self]; 

            [view addGestureRecognizer:[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureRecognizer:)]];

            [view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureRecognizer:)]];

            [view addGestureRecognizer:[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressGestureRecognizer:)]];

            [view addGestureRecognizer:pinchGesture];

            [view addGestureRecognizer:rotateGesture];

            [view setBackgroundColor:[UIColor randomColor]];

}

-(void)pinchGestureRecognizer:(UIPinchGestureRecognizer*)gesture{

    [gesture.view setTransform:CGAffineTransformScale(gesture.view.transform, gesture.scale, gesture.scale)];

    gesture.scale = 1;

    [gesture.view.superview bringSubviewToFront:gesture.view];

}

-(void)rotationGestureRecognizer:(UIRotationGestureRecognizer*)gesture{

    [gesture.view setTransform:CGAffineTransformRotate(gesture.view.transform, gesture.rotation)];

    gesture.rotation = 0;

    [gesture.view.superview bringSubviewToFront:gesture.view];

}

-(void)panGestureRecognizer:(UIPanGestureRecognizer*)gesture{

    CGPoint touchPoint = [gesture locationInView:gesture.view.superview];  

    if (gesture.state == UIGestureRecognizerStateBegan){

        centerPoint = gesture.view.center;

        beginTouchPoint = touchPoint;

    }

    [gesture.view setCenter: CGPointMake(centerPoint.x+(touchPoint.x-beginTouchPoint.x), centerPoint.y+(touchPoint.y-beginTouchPoint.y))];

    [gesture.view.superview bringSubviewToFront:gesture.view];

}

-(void)tapGestureRecognizer:(UITapGestureRecognizer *)gesture{

    static int i;

    NSLog(@"tap gesture %d",i++);

/* 注意,如果使用了单击和双击手势,为了手势识别精确,需要使用到UIGestureRecognizer的实例方法:requireGestureRecognizerToFail:他可以指定某一个 recognizer,即便自己已经滿足條件了,也不會立刻触发,会等到该指定的 recognizer 确定失败之后才触发。代码参考如下:

    [onceTapGR requireGestureRecognizerToFail:doubleTapGR];

 另外Swipe(滑动,快速移动)、Pan (拖移,慢速移动)这两个手势也会存在共存干扰问题,同样可以使用这个方法来解决识别正确的哪一个手势。

 */

 }

-(void)longPressGestureRecognizer:(UILongPressGestureRecognizer *)gesture{

    static int j;

//    由于长按手势会在识别和抬起的时候都进入这个方法,所以这里最好判断,将犯法实现放在开始识别进来的时候进行调用就行,避免了一次长按调用两次方法内容。

    if (gesture.state == UIGestureRecognizerStateBegan) {

        NSLog(@"longPress gesture %d",j++);

    }

}

//下面这个方法可以实现相似的手势共存(return,YES),手势pan和rotation的共存,(既同时可用)如果要只识别一个手势return NO即可。进入UIGestureRecognizer.h文件中可以看到官方的详细说明。2014-07-11

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{

    if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] || [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {

        return NO;

    }else { 

     return YES;

    }

}

原文地址:https://www.cnblogs.com/longtaozi/p/3838624.html