• IOS各种手势操作实例


    先看下效果

    手势相关的介绍

    IOS中手势操作一般是 UIGestureRecognizer 类的几个手势子类去实现,一般我们用到的手势就这么5种:

    1、点击  UITapGestureRecognizer

    2、平移  UIPanGestureRecognizer

    3、缩放  UIPinchGestureRecognizer

    4、旋转  UIRotationGestureRecognizer

    5、轻扫  UISwipeGestureRecognizer

    我们上面这个实例中就用到了上面这5种手势,不过其中 点击与轻扫没有体现出来,只是输出了下日志而已,一会看代码

    下面我们来分别介绍下这几种手势

    1、UITapGestureRecognizer 点击手势

    UITapGestureRecognizer* tapGes = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapGes:)];
    // 点击次数,默认为1,1为单击,2为双击
    tapGes.numberOfTapsRequired = 2;

    这个点击手势类有一个属性 numberOfTapsRequired 用于设置点击数,就是点击几次才触发这个事

    2、UIPanGestureRecognizer 平移手势

    // 平移手势
    - (void)initPanGes{
        
        UIPanGestureRecognizer* panGes = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGes:)];
        
        [self.imgView addGestureRecognizer:panGes];
    }
    
    - (void)panGes:(UIPanGestureRecognizer*)ges{
        
        // 获取平移的坐标点
        CGPoint transPoint =  [ges translationInView:self.imgView];
    }

    平移手势本身没太多可设置的属性,在平移事件触发手,可以用  translationInView 方法获取当前平移坐标点

    3、UIPinchGestureRecognizer 缩放手势

    // 缩放手势
    - (void)initPinGes{
        
        UIPinchGestureRecognizer* pinGes = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinGes:)];
        [self.imgView addGestureRecognizer:pinGes];
    }
    - (void)pinGes:(UIPinchGestureRecognizer*)ges{
        
        // 缩放
        self.imgView.transform = CGAffineTransformScale(self.imgView.transform, ges.scale, ges.scale);
    }

    缩放手势在事件里面可以获取 scale 属性,表示当前缩放值

    4、UIRotationGestureRecognizer 旋转手势

    // 旋转手势
    - (void)initRotation{
        
        UIRotationGestureRecognizer* rotationGes = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotationGes:)];
        [self.imgView addGestureRecognizer:rotationGes];
    }
    - (void)rotationGes:(UIRotationGestureRecognizer*)ges{
        
        // 旋转图片
        self.imgView.transform = CGAffineTransformRotate(self.imgView.transform, ges.rotation);
    }

    旋转手势在事件里面可以通过获取 rotation 属性获取当前旋转的角度

    5、UISwipeGestureRecognizer 轻扫手势

    // 轻扫手势
    - (void)initSwipeGes{
        
        // 创建 从右向左 轻扫的手势
        UISwipeGestureRecognizer* swipeLeftGes = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeGes:)];
        // 方向,默认是从左往右
        // 最多只能开启一个手势,如果要开启多个就得创建多个手势
        // 监听从右向左的方向
        swipeLeftGes.direction = UISwipeGestureRecognizerDirectionLeft;
        [self.imgView addGestureRecognizer:swipeLeftGes];
    
    }
    - (void)swipeGes:(UISwipeGestureRecognizer*)ges{
        
        // ges.direction方向值
        NSLog(@"%s diection:%lu",__func__,(unsigned long)ges.direction);
    }

    轻扫手势对象需要设置 direction 属性,默认是只监听从左向右,这是一个枚举值 UISwipeGestureRecognizerDirection

    UISwipeGestureRecognizerDirectionRight  从左向右(默认值)

    UISwipeGestureRecognizerDirectionLeft    从右向左

    UISwipeGestureRecognizerDirectionUp    从下向上

    UISwipeGestureRecognizerDirectionDown  从上向下

    下面看一下我们上面那个效果图实现代码吧

    //
    //  ViewController.m
    //  各种手势操作
    //
    //  Created by xgao on 16/3/24.
    //  Copyright © 2016年 xgao. All rights reserved.
    //
    
    #import "ViewController.h"
    
    @interface ViewController ()<UIGestureRecognizerDelegate>
    
    @property (weak, nonatomic) IBOutlet UIImageView *imgView;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        [self initTapGes];
        [self initPanGes];
        [self initPinGes];
        [self initRotation];
        [self initSwipeGes];
    }
    
    // 点击手势
    - (void)initTapGes{
        
        UITapGestureRecognizer* tapGes = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapGes:)];
        // 点击次数,默认为1,1为单击,2为双击
        tapGes.numberOfTapsRequired = 2;
        tapGes.delegate = self;
        
        [self.imgView addGestureRecognizer:tapGes];
    }
    - (void)tapGes:(UITapGestureRecognizer*)ges{
        
        NSLog(@"%s",__func__);
    }
    
    // 平移手势
    - (void)initPanGes{
        
        UIPanGestureRecognizer* panGes = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGes:)];
        
        panGes.delegate = self;
        
        [self.imgView addGestureRecognizer:panGes];
    }
    - (void)panGes:(UIPanGestureRecognizer*)ges{
        
        // 获取平移的坐标点
        CGPoint transPoint =  [ges translationInView:self.imgView];
        
        // 在之前的基础上移动图片
        self.imgView.transform = CGAffineTransformTranslate(self.imgView.transform, transPoint.x, transPoint.y);
        
        // 复原,必需复原
        // 每次都清空一下消除坐标叠加
        [ges setTranslation:CGPointZero inView:self.imgView];
        
        NSLog(@"%s",__func__);
    }
    
    // 缩放手势
    - (void)initPinGes{
        
        UIPinchGestureRecognizer* pinGes = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinGes:)];
        pinGes.delegate = self;
        
        [self.imgView addGestureRecognizer:pinGes];
    }
    - (void)pinGes:(UIPinchGestureRecognizer*)ges{
        
        // 缩放
        self.imgView.transform = CGAffineTransformScale(self.imgView.transform, ges.scale, ges.scale);
        
        // 复原
        // 每次都清空一下消除叠加
        ges.scale = 1;
    }
    
    // 旋转手势
    - (void)initRotation{
        
        UIRotationGestureRecognizer* rotationGes = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotationGes:)];
        rotationGes.delegate = self;
        
        [self.imgView addGestureRecognizer:rotationGes];
    }
    - (void)rotationGes:(UIRotationGestureRecognizer*)ges{
        
        // 旋转图片
        self.imgView.transform = CGAffineTransformRotate(self.imgView.transform, ges.rotation);
        
        // 复原
        // 每次都清空一下消除叠加
        ges.rotation = 0;
        
        NSLog(@"%s",__func__);
    }
    
    // 轻扫手势
    - (void)initSwipeGes{
        
        // 创建 从右向左 轻扫的手势
        UISwipeGestureRecognizer* swipeLeftGes = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeGes:)];
        // 方向,默认是从左往右
        // 最多只能开启一个手势,如果要开启多个就得创建多个手势
        // 监听从右向左的方向
        swipeLeftGes.direction = UISwipeGestureRecognizerDirectionLeft;
        swipeLeftGes.delegate = self;
        
        [self.imgView addGestureRecognizer:swipeLeftGes];
        
        
        // 创建 从下向上 轻扫的手势
        UISwipeGestureRecognizer* swipeUpGes = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeGes:)];
        // 监听从下向上的方向
        swipeUpGes.direction =  UISwipeGestureRecognizerDirectionUp;
        swipeUpGes.delegate = self;
        
        [self.imgView addGestureRecognizer:swipeUpGes];
    }
    - (void)swipeGes:(UISwipeGestureRecognizer*)ges{
        
        // ges.direction方向值
        NSLog(@"%s diection:%lu",__func__,(unsigned long)ges.direction);
    }
    
    
    #pragma mark - UIGestureRecognizerDelegate
    
    // 判断是否能触发手势
    - (BOOL)gestureRecognizerShouldBegin:(UITapGestureRecognizer *)gestureRecognizer{
        
        return YES;
    }
    
    // 是否允许多手势操作,不是多触摸点
    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
        
        return YES;
    }
    
    @end

    这里需要注意的有两点:

    1、对于 平移、缩放、旋转 这3个手势,我们如果要用它的值去处理的话,要记得复原!复原!复原!这点很重要!重要的事说3遍~~

      平移手势里面我们需要设置 setTranslation:CGPointZero 来复原它的坐标值,不然下一次事件触发这个坐标值会叠加
      缩放手势里面设置 ges.scale = 1 来复原它的缩放值
      旋转手势里面设置 ges.rotation = 0 来复原它的角度值

    2、假如我们需要多手势一起用的时候就需要设置下delegate 里面的一个返回参数的方法了

      

    // 是否允许多手势操作,不是多触摸点
    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
        
        return YES;
    }

    这次分享就到这里~~有什么不清楚的,就留言吧 ^_^

  • 相关阅读:
    GraphQL:Descriptor Attributes
    C++ 条件变量
    C++ future
    C++ 互斥
    C++ 通用锁管理
    并发
    C++ 线程
    智能指针
    PMP4.项目整合管理4.7结束项目或阶段
    PMP4.项目整合管理4.5监控项目工作
  • 原文地址:https://www.cnblogs.com/xgao/p/6626446.html
Copyright © 2020-2023  润新知