• iOS-手势识别


    /**
     1. 使用手势识别的四个步骤
     
     1> 实例化手势识别
        - (id)initWithTarget:(id)target action:(SEL)action;
     2> 设置手势识别属性
     3> 将手势识别附加到指定的视图
        addGestureRecognizer
     
     4> 编写监听方法
     
     用代码创建一个UIImageView添加到视图,实验6种手势识别。
    
     3. 手势说明
     
     0> UIGestureRecognizer     所有手势识别的父类,不允许直接使用,可以用来自定义手势(建议大家不要挑战)
     
        最常用的属性:
     
        view:   发生手势的视图
        state:  手势当前的状态,主要用于连续手势,对于离散手势一般不使用
     
     
     
     1> UITapGestureRecognizer          点按手势(离散手势,其他手势都是连续手势)
     
        属性:
        numberOfTapsRequired       点击次数,单击双击
        numberOfTouchesRequired    手指根数
     
     2> UILongPressGestureRecognizer    长按手势
     
        属性不建议修改
     
     3> UIPanGestureRecognizer          拖动手势
     
        属性:不常用
        方法:
        // 在视图中拖动的距离
        - (CGPoint)translationInView:(UIView *)view;
        // 在视图中拖动的速度,通常可用于模拟惯性,需要一些物理方面的计算
         - (CGPoint)velocityInView:(UIView *)view;
     
     4> UIPinchGestureRecognizer        捏合手势
     
        属性:
        scale           比例
        velocity        捏合速度,不常用
     
     5> UIRotationGestureRecognizer     旋转手势
     
        属性
        rotation        旋转角度
        velocity        旋转速度,不常用
     
     6> UISwipeGestureRecognizer        轻扫手势,通常添加到根视图上
        
        属性
        numberOfTouchesRequired     参与轻扫手势的手指根数
        direction                   轻扫的方向
     
        提示:
        1) 如果要检测几个方向的轻扫,需要分别实例化几个轻扫手势
        2) 轻扫手势虽然是连续手势,但是不需要去处理UIGestureRecognizerStateChanged状态
            因为是在手指离开屏幕后,该手势才被识别的
     
     其他技巧
     
        在if语句中,将常量放置在判断条件的左侧,可以避免因为只写了 = 出现警告,置之不理的情况!
     */
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        // 0. 实例化UIImageView
        UIImage *image = [UIImage imageNamed:@"001"];
        UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
        
        [imageView setFrame:CGRectMake(10, 100, 300, 196)];
        [self.view addSubview:imageView];
        
        [imageView setUserInteractionEnabled:YES];
        
        // 1. 添加点按手势
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];
        // 定义双击
        tap.numberOfTapsRequired = 2;
        [imageView addGestureRecognizer:tap];
        
        // 2. 添加长按手势
        UILongPressGestureRecognizer *longTap = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longTap:)];
        [imageView addGestureRecognizer:longTap];
        
        // 3. 拖动手势
        UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
        
        [imageView addGestureRecognizer:pan];
        
        // 4. 捏合手势
        UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)];
        [imageView addGestureRecognizer:pinch];
        
        // 5. 旋转手势
        UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotate:)];
        [imageView addGestureRecognizer:rotation];
        
        // 6. 轻扫手势
        // 如果要做清扫手势,需要分别实例化4个方向的手势
        UISwipeGestureRecognizer *swipeUp = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
        
        swipeUp.direction = UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight;
        
        [self.view addGestureRecognizer:swipeUp];
        
    //    UISwipeGestureRecognizer *swipeDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
    //    swipeDown.direction = UISwipeGestureRecognizerDirectionDown;
    //    [self.view addGestureRecognizer:swipeDown];
    //    
    //    UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
    //    swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
    //    [self.view addGestureRecognizer:swipeLeft];
    //
    //    UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
    //    swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
    //    [self.view addGestureRecognizer:swipeRight];
    }
    
    #pragma mark - 点按手势
    - (void)tap:(UITapGestureRecognizer *)recognizer
    {
        // 双击放大图片
        UIImageView *imageView = (UIImageView *)recognizer.view;
    
        [UIView animateWithDuration:0.8f animations:^{
            [imageView setTransform:CGAffineTransformScale(imageView.transform, 2.0, 2.0)];
        } completion:^(BOOL finished) {
            [UIView animateWithDuration:0.5f animations:^{
                [imageView setTransform:CGAffineTransformScale(imageView.transform, 0.5, 0.5)];
            }];
        }];
    }
    
    #pragma mark - 长按手势
    - (void)longTap:(UILongPressGestureRecognizer *)recognizer
    {
        NSLog(@"长按");
        // 长按旋转图片
        // 开始长按
        // 在形变时,iOS采取就近原则旋转,如果不能按照希望的方向旋转,可以增加一些修正值,例如0.01
        // 直接通过形变属性,要实现一次性转一圈,比较困难,可以分两次进行
        if (UIGestureRecognizerStateBegan == recognizer.state) {
            [UIView animateWithDuration:0.8f animations:^{
                [recognizer.view setTransform:CGAffineTransformRotate(recognizer.view.transform, M_PI - 0.01)];
            }];
        } else if (UIGestureRecognizerStateEnded == recognizer.state) {
            [UIView animateWithDuration:0.8f animations:^{
                [recognizer.view setTransform:CGAffineTransformRotate(recognizer.view.transform, M_PI - 0.01)];
            } completion:^(BOOL finished) {
                // 清除所有的形变属性
                [recognizer.view setTransform:CGAffineTransformIdentity];
            }];
        }
    }
    
    #pragma mark - 拖动
    - (void)pan:(UIPanGestureRecognizer *)recognizer
    {
        CGPoint translation = [recognizer translationInView:self.view];
        
        // 让图像根据手指移动
        if (UIGestureRecognizerStateChanged == recognizer.state) {
            // 形变参数,有Make的时候,是相对初始位置计算的
            // 没有Make是递增修改形变的
            [recognizer.view setTransform:CGAffineTransformTranslate(recognizer.view.transform, translation.x, translation.y)];
            
            // 拖动手指中的平移距离是相对于初始位置,如果使用CGAffineTransformTranslate累加形变方法
            // 需要在每次位移之后,重置recognizer的位移量,就是将位移量清零
            [recognizer setTranslation:CGPointZero inView:recognizer.view];
        }
    }
    
    #pragma mark - 捏合
    - (void)pinch:(UIPinchGestureRecognizer *)recognizer
    {
        // 调整图像的显示比例
        if (UIGestureRecognizerStateChanged == recognizer.state) {
            
            // 等比例缩放
            [recognizer.view setTransform:CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale)];
            
            // 在设置累加形变参数时,需要充值手势的缩放比例
            recognizer.scale = 1.0f;
        }
    }
    
    #pragma mark - 旋转
    - (void)rotate:(UIRotationGestureRecognizer *)recognizer
    {
        if (UIGestureRecognizerStateChanged == recognizer.state) {
            recognizer.view.transform = CGAffineTransformRotate(recognizer.view.transform, recognizer.rotation);
            
            // 重置旋转量
            recognizer.rotation = 0.0f;
        }
    }
    
    
    #pragma mark - 轻扫
    - (void)swipe:(UISwipeGestureRecognizer *)recognizer
    {
        //NSLog(@"%d", recognizer.direction);
        if (UISwipeGestureRecognizerDirectionDown == recognizer.direction) {
            NSLog(@"向下");
        } else if (UISwipeGestureRecognizerDirectionUp == recognizer.direction) {
            NSLog(@"向上");
        } else if (UISwipeGestureRecognizerDirectionLeft == recognizer.direction) {
            NSLog(@"向左");
        } else if (UISwipeGestureRecognizerDirectionRight == recognizer.direction) {
            NSLog(@"向右");
        }
    }
  • 相关阅读:
    产品经理之职责篇
    Scrum实践
    通用泛型存储接口的设计
    Jquery ajax执行顺序 返回自定义错误信息
    Js参数值中含有单引号或双引号解决办法
    Winform下的HTMLEditor引用Microsoft.mshtml的注意事项
    引用类型传参不加 ref 的注意事项
    List<T> 排序(Sort)查找(Find)功能的多种实现
    多线程三种传值方式
    SQL 存储过程传入多个ID
  • 原文地址:https://www.cnblogs.com/DarbyCJ/p/3671214.html
Copyright © 2020-2023  润新知