3.6 iOS手势识别的状态和手势识别器幕后原理

2.2手势识别的状态和手势识别器幕后原理

(一)手势的状态

// 手势状态
typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
    UIGestureRecognizerStatePossible,   // 尚未识别是何种手势操作(但可能已经触发了触摸事件),默认状态
    UIGestureRecognizerStateBegan,      // 手势已经开始,此时已经被识别,但是这个过程中可能发生变化,手势操作尚未完成
    UIGestureRecognizerStateChanged,    // 手势状态发生转变
    UIGestureRecognizerStateEnded,      // 手势识别操作完成(此时已经松开手指)
    UIGestureRecognizerStateCancelled,  // 手势被取消,恢复到Possible状态
    UIGestureRecognizerStateFailed,     // 手势识别失败,恢复到Possible状态
    UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // 手势识别完成,同UIGestureRecognizerStateEnded
};

(二)离散型手势识别器和连续型手势识别器之间的对比:

调用回调方法区别:

14636547400991.png

状态之间切换区别:
14636543727544.png

总结:离散型手势一旦识别就无法取消,而且只会调用一次手势操作事件(初始化手势时指定的回调方法)。而连续型手势会多次调用手势操作事件,而且在连续手势识别后可以取消手势.两者调用回调方法的次数是不同的.

(三)手势识别器幕后原理
手势识别器是在正常的响应者链条之上.默认情况下,UIWindow首先将触摸事件发送给手势识别器,只有手势识别器无法处理触摸事件时,事件才会被转发给响应者链条.
应用程序判断手势是否别识别的过程:
手势识别器进入UIGestureRecognizerStatePossible状态:
离散型手势:

    1>手势识别器将判断手势处于`UIGestureRecognizerStateRecognized`
      还是`UIGestureRecognizerStateFailed`状态.
    2>如果是`UIGestureRecognizerStateRecognized`状态,手势识别器将处理事件,
      并调用指定的回调方法.
      如果是`UIGestureRecognizerStateFailed`状态,手识别器将把触摸事件装发
      给`响应者链条`.

连续型手势:

    1>手势识别器将判断手势处于`UIGestureRecognizerStateBegan`
      还是`UIGestureRecognizerStateFailed`状态.
    2>如果手势处于UIGestureRecognizerStateBegan状态,手势识别器将处理事件,并
      调用回调方法.然后当手势发生变化时,都将进入`UIGestureRecognizerStateChanged`
      状态,并调用指定的回调方法.这个过程不断重复,直到触摸结束并进入`UIGestureRecognizerStateEnded`
      状态.如果触摸方式不再符合预期手势,将进入`UIGestureRecognizerStateCancelled`
      状态.
      如果手势处于`UIGestureRecognizerStateFailed`状态,手势识别器将把触摸事件装发
      给`响应者链条`.

经验谈:

手势从状态UIGestureRecognizerStatePossible变化到状态UIGestureRecognizerStateFailed所需的事件可能很长.如果手势识别器处理触摸事件的速度慢的莫名其妙,最好在手势处理方法中输出相关的状态,这样就可以清楚地知道手势状态的变换情况,就可以确定延迟出现在什么地方.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 手势识别器是附加到视图的对象,将低级别事件处理代码转换为更高级别的操作,它允许视图以控件执行的方式响应操作。 手势...
    坤坤同学阅读 4,123评论 0 9
  • 好奇触摸事件是如何从屏幕转移到APP内的?困惑于Cell怎么突然不能点击了?纠结于如何实现这个奇葩响应需求?亦或是...
    Lotheve阅读 57,844评论 51 603
  • 在iOS开发中经常会涉及到触摸事件。本想自己总结一下,但是遇到了这篇文章,感觉总结的已经很到位,特此转载。作者:L...
    WQ_UESTC阅读 6,090评论 4 26
  • -- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实...
    翘楚iOS9阅读 2,998评论 0 13
  • 概述 手势识别器是处理视图中的触摸或者按压事件最简单的方法,我们可以在任意视图上附加一个或多个手势识别器。手势识别...
    渐z阅读 3,083评论 0 2