IOS开发之手势——UIGestureRecognizer 共存

在 iPhone 或 iPad 的开发中,除了用 touchesBegan / touchesMoved / touchesEnded 这组方法来控制使用者的手指触控外,也可以用 UIGestureRecognizer 的衍生类別来进行判断。用 UIGestureRecognizer 的好处在于有现成的手势,开发者不用自己计算手指移动轨迹。UIGestureRecognizer的衍生类別有以下几种:

  • UITapGestureRecognizer
  • UIPinchGestureRecognizer
  • UIRotationGestureRecognizer
  • UISwipeGestureRecognizer
  • UIPanGestureRecognizer
  • UILongPressGestureRecognizer

从命名上不难了解這些类別所对应代表的手势,分別是 Tap(点一下)、Pinch(二指往內或往外拨动)、Rotation(旋转)、Swipe(滑动,快速移动)、Pan (拖移,慢速移动)以及 LongPress(长按)。這些手势別在使用上也很简单,只要在使用前定义并添加到对应的视图上即可。

// 定义一个 recognizer, 并加到需要偵測该手势的 UIView 元件上
- (void)viewDidLoad {UISwipeGestureRecognizer* recognizer;// handleSwipeFrom 是偵測到手势,所要呼叫的方法
    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:selfaction:@selector(handleSwipeFrom)];// 不同的 Recognizer 有不同的实体变数// 例如 SwipeGesture 可以指定方向// 而 TapGesture 則可以指定次數
    recognizer.direction = UISwipeGestureRecognizerDirectionUp[self.view addGestureRecognizer:recognizer];[recognizer release];}- (void)handleSwipeFrom:(UISwipeGestureRecognizer*)recognizer {// 触发手勢事件后,在这里作些事情// 底下是刪除手势的方法
    [self.view removeGestureRecognizer:recognizer];}

问题來了。有些手势其实是互相关联的,例如 Tap 与 LongPress、Swipe与 Pan,或是 Tap 一次与Tap 兩次。当一個 UIView 同时添加兩个相关联的手势时,到底我这一下手指头按的要算是 Tap 还是 LongPress?如果照預设作法来看,只要「先滿足条件」的就会跳出并呼叫对应方法,举例来说,如果同时注册了 Pan 和 Swipe,只要手指头一移动就会触发 Pan 然后跳出,因而永远都不會发生 Swipe;单点与双点的情形也是一样,永远都只会触发单点,不會有双点。

那么这个问题有解吗?答案是肯定的,UIGestureRecognizer 有个方法叫做requireGestureRecognizerToFail,他可以指定某一个 recognizer,即便自己已经滿足條件了,也不會立刻触发,会等到该指定的 recognizer 确定失败之后才触发。以同时支持单点与双点的手势为例,代码如下:

- (void)viewDidLoad {// 单击的 Recognizer
    UITapGestureRecognizer* singleRecognizer;singleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:selfaction:@selector(handleSingleTapFrom)];singleTapRecognizer.numberOfTapsRequired = 1; // 单击
    [self.view addGestureRecognizer:singleRecognizer];// 双击的 Recognizer
    UITapGestureRecognizer* double;doubleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:selfaction:@selector(handleDoubleTapFrom)];doubleTapRecognizer.numberOfTapsRequired = 2; // 双击
    [self.view addGestureRecognizer:doubleRecognizer];// 关键在这一行,如果双击确定偵測失败才會触发单击
    [singleRecognizer requireGestureRecognizerToFail:doubleRecognizer];[singleRecognizer release];[doubleRecognizer release];
}

UIview 添加触摸.手势相关推荐

  1. UI之摇晃手机和触摸手势

    摇晃手机 -(void)motionBegan:(UIEventSubtype)motionwithEvent:(UIEvent *)event//摇晃触发.[UIViewanimateWithDur ...

  2. Android 触摸手势基础 官方文档概览

    触摸手势检测基础 手势检测一般包含两个阶段: 1.获取touch事件数据 2.解析这些数据,看它们是否满足你的应用所支持的某种手势. 相关API: MotionEvent 兼容版的: MotionEv ...

  3. iOS 手写键盘与触摸手势冲突,导致崩溃闪退

    问题描述: 在iPhone上调用键盘,用键盘输入时正常没有任何问题,但切换成手写输入法之后,写第二个字的时候会出现闪退崩溃的现象.其原因就在于手写键盘的事件与触摸手势的事件发生了冲突. 解决方案: 扩 ...

  4. iOS添加边缘手势( UIScreenEdgePanGestureRecognizer)实现侧滑效果

    通过添加边缘手势来实现侧滑的效果,类似于qq界面的边缘侧滑 ,亦或广告界面的侧滑 @interface中定义一个全局view @property(nonatomic,weak)UIView *adVi ...

  5. 移动开发框架,第【二】弹:Hammer.js 移动设备触摸手势js库

    hammer.js是一个多点触摸手势库,能够为网页加入Tap.Double Tap.Swipe.Hold.Pinch.Drag等多点触摸事件,免去自己监听底层touchstart.touchmove. ...

  6. 《精解 Windows 10》——2.10 触摸手势

    本节书摘来自异步社区<精解 Windows 10>一书中的第2章,第2.10节,作者:李志鹏著,更多章节内容可以访问云栖社区"异步社区"公众号查看 2.10 触摸手势 ...

  7. ipados远程linux软件,JingOS Linux平板系统v0.6下载发布 支持多点触摸手势

    原标题:JingOS Linux 平板系统 v0.6 下载发布:iPadOS 风格,附安装方法 1月29日消息 今年1月份,一款新的操作系统 JingOS 官网上线,官方介绍是全球首个 iPadOS ...

  8. art-pi lvgl添加触摸事件部分代码

    art-pi lvgl 添加触摸事件部分代码 文档说明 该文章仅供学习参考使用,非官方使用说明文档. littlevgl2rtt 介绍 上一篇文章(art-pi添加lvgl支持包)简单描述了如何在 a ...

  9. OpenGL ES 2.0 for Android教程(九):添加触摸反馈

    OpenGL ES 2 第九章:添加触摸反馈 文章传送门 OpenGL ES 2.0 for Android教程(一) OpenGL ES 2.0 for Android教程(二) OpenGL ES ...

最新文章

  1. android studio同步代码块,Android Studio快捷键大全
  2. poj 3660 Cow Contest
  3. PHP 自学教程之MySQL数据库
  4. mysql索引执行计划_第六章· MySQL索引管理及执行计划
  5. Python从键盘输入多行文本数据的方法
  6. 爬虫前期知识的储备(二)
  7. java哈希映射干什么的_java – 为什么在哈希映射中有空值或空键是有用的?
  8. 关于python中的字符串编码理解
  9. Unix文件系统基本概述
  10. 网页抓取软件-免费网页自动采集抓取任意内容软件
  11. 【解决方案】Ehome协议视频融合平台EasyCVR在危化行业的安防监控应用
  12. 实战OpenPose项目1:开篇使用文档
  13. 软考软件设计师下午真题-面向对象的程序设计与实现-访问者设计模式(2015年上半年试题六)Java代码讲解
  14. Windows and CentOS IPv4转IPv6隧道方法
  15. React Native 填坑记录01
  16. 字幕制作 分享剪辑视频添加滚动字幕的操作步骤
  17. python控制excel打印_python对excel表格的操作
  18. 【matlab实现多种股票数据同列收盘价格分析走势图,以及涨跌幅变化曲线第二篇】
  19. 宝塔一键安装部署tipask登录出现错误:The email must be at least 8 characters怎么回事
  20. Linux下的桥接模式

热门文章

  1. android wifi优化,WiFi信号如何快速优化? 安卓APP来帮忙
  2. 转载:位图和矢量图的区别
  3. 设计公司该怎样开展业务?
  4. 大数据高级开发工程师——Spark学习笔记(9)
  5. HEBUT_环境保护与可持续发展_课件整理_05模块五
  6. 小叶入门之Python爬虫(一)
  7. 用Python计算利率,告诉你亏了多少!
  8. 计算机word考试试题模板,2017年职称计算机考试Word2003巩固练习题13
  9. VMware是什么?
  10. 防御100gDDoS需要多少钱