触摸手势识别2

// 1. 点按手势
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap:)];
    // 点按次数,例如双击2
    // 注意:在iOS中最好少用双击,如果一定要用,就一定要有一个图形化的界面告知用户可以双击
    [tap setNumberOfTapsRequired:2];
    // 用几根手指点按
    [tap setNumberOfTouchesRequired:1];
    [imageView addGestureRecognizer:tap];
    
    // 2. 长按手势 Long Press
    UILongPressGestureRecognizer *longTap = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longTap:)];
    [imageView addGestureRecognizer:longTap];
    
    // 3. 拖动手势 Pan
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(pan:)];
    [imageView addGestureRecognizer:pan];
    
    // 4. 旋转手势 Rotation
    UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotation:)];
    [imageView addGestureRecognizer:rotation];
    
    // 5. 缩放(捏合)手势 Pinch
    UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinch:)];
    [imageView addGestureRecognizer:pinch];
    
    // 6. 轻扫手势 Swipe
    /*
     手指在屏幕上扫动,和拖动手势的区别在于,手指离开屏幕才会触发监听方法
     
     1> 手指可以上、下、左、右四个方向轻轻扫动,如果没有指定方向,默认都是向右扫动
     2> 在设置轻扫手势时,通常需要将手势识别添加到父视图上监听
     3> 在监听方法中,注意不要使用recognizaer.view,因为手势监听的是父视图,而要处理的视图通常是其他的视图
     
     如果要使用多个方向的轻扫手势,需要指定多个轻扫手势,通常只需指定左右两个方向即可。
     
     因为iOS用户大多不习惯上下的轻扫动作
     */
    UISwipeGestureRecognizer *swipe1 = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipe:)];
    [swipe1 setDirection:UISwipeGestureRecognizerDirectionUp];
    [self.view addGestureRecognizer:swipe1];
    
    UISwipeGestureRecognizer *swipe2 = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipe:)];
    [swipe2 setDirection:UISwipeGestureRecognizerDirectionDown];
    [self.view addGestureRecognizer:swipe2];
    
    UISwipeGestureRecognizer *swipe3 = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipe:)];
    [swipe3 setDirection:UISwipeGestureRecognizerDirectionLeft];
    [self.view addGestureRecognizer:swipe3];
    
    UISwipeGestureRecognizer *swipe4 = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipe:)];
    [swipe4 setDirection:UISwipeGestureRecognizerDirectionRight];
    [self.view addGestureRecognizer:swipe4];

#pragma mark - 手势监听方法
#pragma mark 轻扫手势
// 尽管轻扫手势也是连续手势,但是该手势是在手指离开屏幕才会被触发的
// 因此,在编写代码时,不需要处理手势的状态
- (void)swipe:(UISwipeGestureRecognizer *)recognizer
{
    // 让图片朝手指不同的方向飞出屏幕,然后再复位
    CGRect frame = kImageInitFrame;
    if (UISwipeGestureRecognizerDirectionUp == recognizer.direction) {
        frame.origin.y -= 400;
    } else if (UISwipeGestureRecognizerDirectionDown == recognizer.direction) {
        frame.origin.y += 400;
    } else if (UISwipeGestureRecognizerDirectionLeft == recognizer.direction) {
        frame.origin.x -= 300;
    } else {
        frame.origin.x += 300;
    }
    
    [UIView animateWithDuration:1.0 animations:^{
        [self.imageView setFrame:frame];
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:1.0f animations:^{
            [self.imageView setFrame:kImageInitFrame];
        }];
    }];
}

#pragma mark 捏合手势
- (void)pinch:(UIPinchGestureRecognizer *)recognizer
{
    /**
     变化过程中,放大缩小
     结束后,恢复
     */
    if (UIGestureRecognizerStateChanged == recognizer.state) {
        [recognizer.view setTransform:CGAffineTransformMakeScale(recognizer.scale, recognizer.scale)];
        
    } else if (UIGestureRecognizerStateEnded == recognizer.state) {
        [UIView animateWithDuration:0.5f animations:^{
            // 恢复初始位置,清除所有的形变效果
            [recognizer.view setTransform:CGAffineTransformIdentity];
        }];
    }
    
}

#pragma mark 旋转手势,至少两根手指
- (void)rotation:(UIRotationGestureRecognizer *)recognizer
{
    // recognizer中的rotation属性是基于图片的初始旋转弧度的
    /**
     变化过程中,旋转
     结束后,恢复
     */
    if (UIGestureRecognizerStateChanged == recognizer.state) {
        [recognizer.view setTransform:CGAffineTransformMakeRotation(recognizer.rotation)];
        /** 
         累加的形变
         */
//        [recognizer.view setTransform:CGAffineTransformRotate(recognizer.view.transform, recognizer.rotation)];
//        // 把手势识别的rotation设置为0,在下一次触发时,以当前的旋转角度为基准继续旋转
//        recognizer.rotation = 0;
    } else if (UIGestureRecognizerStateEnded == recognizer.state) {
        [UIView animateWithDuration:0.5f animations:^{
            // 恢复初始位置,清除所有的形变效果
            [recognizer.view setTransform:CGAffineTransformIdentity];
        }];
    }
}

#pragma mark 拖动手势
- (void)pan:(UIPanGestureRecognizer *)recognizer
{
    NSLog(@"拖动");
    
    /*
     拖动手势结束后,以动画的方式回到初始位置
     */
    // 在手势状态处于“变化”时处理图片的移动
    // UIGestureRecognizerStateChanged类似于touchesMoved方法,会不断地被调用
    if (UIGestureRecognizerStateChanged == recognizer.state) {

        // translationInView,判断在父视图中平移的位置,平移的偏移量始终以视图的初始位置为基础
        CGPoint deltaPoint = [recognizer translationInView:self.view];

        // 用形变参数来改变图像的位置
        [recognizer.view setTransform:CGAffineTransformMakeTranslation(deltaPoint.x, deltaPoint.y)];
        
//        CGRect targetRect = kImageInitFrame;
//        targetRect.origin.x += deltaPoint.x;
//        targetRect.origin.y += deltaPoint.y;
//        
//        [recognizer.view setFrame:targetRect];
    } else if (UIGestureRecognizerStateEnded == recognizer.state) {
        [UIView animateWithDuration:0.5f animations:^{
            // 将图片复位
//            [recognizer.view setFrame:kImageInitFrame];
            [recognizer.view setTransform:CGAffineTransformIdentity];
        }];
    }
}

#pragma mark 长按手势
- (void)longTap:(UILongPressGestureRecognizer *)recognizer
{
    NSLog(@"长按");
    /*
     旋转半圈的动画,动画完成后恢复
     
     长按手势属于连续手势,是需要处理状态
     
     因为长按通常只有一根手指,因此在Began状态下,长按手势就已经被识别了
     
     针对长按的处理,最好放在UIGestureRecognizerStateBegan状态中实现
     */
    if (UIGestureRecognizerStateBegan == recognizer.state) {
        NSLog(@"长按");
        
        [UIView animateWithDuration:1.0f animations:^{
            [recognizer.view setTransform:CGAffineTransformMakeRotation(M_PI)];
        } completion:^(BOOL finished) {
            // CGAffineTransformIdentity将视图的形变复原(平移、缩放、旋转)
            [recognizer.view setTransform:CGAffineTransformIdentity];
        }];
    } else if (UIGestureRecognizerStateEnded == recognizer.state) {
//        [UIView animateWithDuration:1.0f animations:^{
//            [recognizer.view setTransform:CGAffineTransformMakeRotation(M_PI)];
//        } completion:^(BOOL finished) {
//            // CGAffineTransformIdentity将视图的形变复原(平移、缩放、旋转)
//            [recognizer.view setTransform:CGAffineTransformIdentity];
//        }];
    }
}

#pragma mark 点按手势
- (void)tap:(UITapGestureRecognizer *)recognizer
{
    NSLog(@"点我了");
    // 做一个动画效果
    // 向下移出屏幕,完成后再重新返回初始位置
    // recognizer.view 就是识别到手势的视图,也就是手势绑定到得视图
    
    CGRect initFrame = recognizer.view.frame;
    CGRect targetFrame = recognizer.view.frame;
    targetFrame.origin.y += 360;
    
    [UIView animateWithDuration:1.0f animations:^{
        // 自动反向重复动画
        [UIView setAnimationRepeatAutoreverses:YES];
        // 设置动画重复次数
        [UIView setAnimationRepeatCount:2];
        
        [recognizer.view setFrame:targetFrame];
    } completion:^(BOOL finished) {
        [recognizer.view setFrame:initFrame];
    }];
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值