关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » iOS开发 »iOS开发教程之手势识别方法

    iOS开发教程之手势识别方法

    2014-11-23 00:00:00 出处:青玉伏案的博客
    分享

    感觉有必要把iOS开发中的手势识别做一个小小的总结。在上一篇iOS开发之自定义表情键盘(组件封装与自动布局)博客中用到了一个轻击手势,就是在轻击Textview时从表情键盘回到系统键盘,在TextView中的手是用storyboard添加的。下面会先给出如何用storyboard给相应的控件添加手势,然后在用纯代码的方式给我们的控件添加手势,手势的用法比较简单。和button的用法类似,也是目标动作回调,话不多说,切入今天的正题。总共有六种手势识别:轻击手势(TapGestureRecognizer),轻扫手势(SwipeGestureRecognizer), 长按手势(LongPressGestureRecognizer), 拖动手势(PanGestureRecognizer), 捏合手势(PinchGestureRecognizer),旋转手势(RotationGestureRecognizer);

    其实这些手势用touche事件完全可以实现,苹果就是把常用的触摸事件封装成手势,来提供给用户。读者完全可以用TouchesMoved来写拖动手势等

    一,用storyboard给控件添加手势识别,当然啦用storyboard得截张图啦

    1.用storyboard添加手势识别,和添加一个Button的步骤一样,首先我们得找到相应的手势,把手势识别的控件拖到大家要添加手势的控件中,截图如下

    2.给我们拖出的手势添加回调事件,和给Button回调事件没啥区别的,在回调方法中添加要实现的业务逻辑即可,截图如下:

     二,纯代码添加手势识别

    用storyboard可以大大简化我们的操作,不过纯代码的方式还是要会的,就像 要Dreamwear编辑网页一样(当然啦,storyboard的拖拽功能要比Dreamwear的拖拽强大的多),用纯代码敲出来的更为灵活,更加便 于维护。不过用storyboard可以减少我们的工作量,这两个要配合着使用才能大大的提高我们的开发效率。个人感觉用storyboard把框架搭起 来(Controller间的关系),一下小的东西还是用纯代码敲出来更好一些。下面就给出如何给我们的控件用纯代码的方式来添加手势识别。

    1.轻击手势(TapGestureRecognizer)的添加

    初始化代码TapGestureRecongnizer的代码如下:

         //新建tap手势 
         UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)]; 
         //设置点击次数和点击手指数 
         tapGesture.numberOfTapsRequired = 1; //点击次数 
         tapGesture.numberOfTouchesRequired = 1; //点击手指数 
         [self.view addGestureRecognizer:tapGesture];

    在回调方法中添加相应的业务逻辑:

     //轻击手势触发方法 
     -(void)tapGesture:(id)sender 
     { 
         //轻击后要做的事情         
     }

    2.长按手势(LongPressGestureRecognizer)

    初始化代码:

    //添加长摁手势 
         UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressGesture:)]; 
         //设置长按时间 
         longPressGesture.minimumPressDuration = 0.5; //(2秒) 
         [self.view addGestureRecognizer:longPressGesture];

    在对应的回调方法中添加相应的方法(当手势开始时执行):

     //常摁手势触发方法 
     -(void)longPressGesture:(id)sender 
     { 
         UILongPressGestureRecognizer *longPress = sender; 
         if (longPress.state == UIGestureRecognizerStateBegan) 
        { 
             UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"提示" message:@"长按触发" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles: nil]; 
             [alter show]; 
         } 
     }

    代码说明:手势的常用状态如下

    开始:UIGestureRecognizerStateBegan

    改变:UIGestureRecognizerStateChanged

    结束:UIGestureRecognizerStateEnded

    取消:UIGestureRecognizerStateCancelled

    失败:UIGestureRecognizerStateFailed

    3.轻扫手势(SwipeGestureRecognizer)

    在初始化轻扫手势的时候得指定轻扫的方向,上下左右。 假如要要添加多个轻扫方向,就得添加多个轻扫手势,不过回调的是同一个方法。

    添加轻扫手势,一个向左一个向右,代码如下:

         //添加轻扫手势 
          UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGesture:)]; 
          //设置轻扫的方向 
          swipeGesture.direction = UISwipeGestureRecognizerDirectionRight; //默认向右 
          [self.view addGestureRecognizer:swipeGesture]; 
    
          //添加轻扫手势 
          UISwipeGestureRecognizer *swipeGestureLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGesture:)]; 
          //设置轻扫的方向 
         swipeGestureLeft.direction = UISwipeGestureRecognizerDirectionLeft; //默认向右 
         [self.view addGestureRecognizer:swipeGestureLeft];

    回调方法如下:

     //轻扫手势触发方法 
      -(void)swipeGesture:(id)sender 
      { 
          UISwipeGestureRecognizer *swipe = sender; 
          if (swipe.direction == UISwipeGestureRecognizerDirectionLeft) 
          { 
              //向左轻扫做的事情 
          } 
          if (swipe.direction == UISwipeGestureRecognizerDirectionRight) 
         { 
             //向右轻扫做的事情 
         } 
     }

    4.捏合手势(PinchGestureRecognizer)

    捏合手势初始化

      //添加捏合手势 
         UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGesture:)]; 
         [self.view addGestureRecognizer:pinchGesture];

    捏合手势要触发的方法(放大或者缩小图片):

      ////捏合手势触发方法 
      -(void) pinchGesture:(id)sender 
      { 
           UIPinchGestureRecognizer *gesture = sender; 
    
          //手势改变时 
          if (gesture.state == UIGestureRecognizerStateChanged) 
          { 
              //捏合手势中scale属性记录的缩放比例 
             _imageView.transform = CGAffineTransformMakeScale(gesture.scale, gesture.scale); 
         } 
    
         //结束后恢复 
         if(gesture.state==UIGestureRecognizerStateEnded) 
         { 
             [UIView animateWithDuration:0.5 animations:^{ 
                 _imageView.transform = CGAffineTransformIdentity;//取消一切形变 
             }]; 
         } 
     }

    5.拖动手势(PanGestureRecognizer)

    拖动手势的初始化

    //添加拖动手势 
         UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGesture:)]; 
         [self.view addGestureRecognizer:panGesture];

    拖动手势要做的方法(通过translationInView获取移动的点,和TouchesMoved方法类似)

     //拖动手势 
     -(void) panGesture:(id)sender 
     { 
         UIPanGestureRecognizer *panGesture = sender; 
    
         CGPoint movePoint = [panGesture translationInView:self.view]; 
    
         //做你想做的事儿 
     }

    6.旋转手势(RotationGestureRecognizer)

    旋转手势的初始化

    //添加旋转手势 
         UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationGesture:)]; 
         [self.view addGestureRecognizer:rotationGesture];

    旋转手势调用的方法:

      //旋转手势 
      -(void)rotationGesture:(id)sender 
      { 
    
          UIRotationGestureRecognizer *gesture = sender; 
    
          if (gesture.state==UIGestureRecognizerStateChanged) 
          { 
              _imageView.transform=CGAffineTransformMakeRotation(gesture.rotation); 
         } 
    
         if(gesture.state==UIGestureRecognizerStateEnded) 
         { 
    
             [UIView animateWithDuration:1 animations:^{ 
                 _imageView.transform=CGAffineTransformIdentity;//取消形变 
             }]; 
         } 
    
     }
    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    帝国CMS7.5编辑器上传图片取消宽高的三种方法

    帝国cms如何自动生成缩略图的实现方法

    Windows 12即将到来,将彻底改变人机交互

    帝国CMS 7.5忘记登陆账号密码怎么办?可以phpmyadmin中重置管理员密码

    帝国CMS 7.5 后台编辑器换行,修改回车键br换行为p标签

    Windows 11 版本与 Windows 10比较,新功能一览

    Windows 11激活产品密钥收集及专业版激活方法

    如何从 Windows 11 中完全删除/卸载 OneNote?无解!

    抖音安全与信任开放日:揭秘推荐算法,告别单一标签依赖

    ultraedit编辑器打开文件时,总是提示是否转换为DOS格式,如何关闭?

    IT头条

    华为Pura80系列新机预热,余承东力赞其复杂光线下的视频拍摄实力

    01:28

    阿里千问3开源首战告捷:全球下载破千万,国产AI模型崛起新高度!

    01:22

    DeepSeek R1小版本试升级:网友实测编程能力已达到国际一线水平

    23:15

    NVIDIA 与 Dell 合作,大规模交付 Blackwell AI 系统

    20:52

    Cerebras 以最快的 Llama 4 Maverick 性能引领 LLM 推理竞赛

    20:51

    技术热点

    PHP中的随机性——你觉得自己幸运吗?

    搞定Ubuntu Linux下WPA无线上网

    Java使用内存映射实现大文件的上传

    MySQL安全性指南

    MySQL两项性能的基本测试浅谈

    教您使用UniqueIdentifier选取SQL Server主键

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。