1.概念

手势是从你用一个或多个手指接触屏幕时开始,直到手指离开屏幕为止所发生的所有事件。无论手势持续多长时间,只要一个或多个手指仍在屏幕上,这个手势就存在。

触摸是指把手指放到IOS设备的屏幕上,从屏幕上拖动或抬起的这样一种行为。手势中涉及的触摸数量等于同时位于屏幕上的手指数量。

手势识别器是一个对象,它知道如何观察用户生成的事件流,并能够识别用户何时以与预定义的手势相匹配的方式进行了触摸和拖动。在检测常见手势时,UIGestureRecognizer类及其各种子类可节省大量工作。UIGestureRecognizer类很好地封装了查找手势的功能,而且方便地应用于任何视图。

2.响应者链、事件

  2.1介绍

由于手势是在事件之内传递到系统的,而事件会通过响应者链responder chain进行传递。

在一个应用中,响应者链是一个可变的能够响应用户事件的对象集合。UIResponder是任何响应者类的超类。UIView是UIResponder的子类,UIControl是UIView的之类,因此所有视图和所有控件都是响应者。响应者应该这样命名的,它们响应系统生成的事件,如屏幕触摸。

  2.2深入

事件传递:如果第一个响应者不处理某个事件、 某个手势,那么它会将该事件传递到响应者链的下一级。第一响应者总是视图或控件(UIView/UIButton等),并且首先对事件进行相应。如果第一响应者不处理该事件,那么它会将改事件传递给其视图控制器UIViewController。如果此视图控制不处理,将传递给第一响应者的父视图。如果父视图没有响应,则该事件将被转到父视图的控制器。这样一层一层地下去。如果任何视图和控制器都没有处理,那么该事件将会传递给应用的窗口。如果窗口不处理该事件,则窗口会将该事件传递给应用的对象实例UIApplication。

如果UIApplication也不处理该事件,那么还有一个地方可以处理,可以构建一个全局响应者作为响应链的最后一环,那就是应用委托(UIResponder的子类)。

举个例子,如果UIButton注册了事件。那么第一响应者是UIButton、然后是父视图、父控制器、父父视图、父父控制器、UIWindow、UIApplication、AppDelegate。如下图:

3. 4个手势通知方法

我们可以使用4个方法通知响应者有关触摸和手势的情况,他们是touchesBegan:withEvent:、touchesMoved:withEvent:、touchesEnded:withEvent:和touchesCancelled:withEvent:。

//手指开始触碰
- (void) touchesBegan:(NSSet*) touches withEvent:(UIEvent*)event
{
//多少次点击
int numTaps = [[touches anyObject] tapCount]; //可以将点转换为视图的本地坐标系
CGPoint point = [[touches anyObject] locationInView: self];
} //手指移动
- (void) touchesMoved:(NSSet*) touches withEvent:(UIEvent*)event
{} //手指离开屏幕
- (void) touchesEnded:(NSSet*) touches withEvent:(UIEvent*)event
{} //当发生某些事件,如来电呼叫,导致手势中断时。在这里可以进行任何的处理操作
- (void) touchesCancelled:(NSSet*) touches withEvent:(UIEvent*)event
{}

下面我们通过这4个方法来写两种手势,分别是水平和垂直轻扫这两种手势。

@property (nonatomic) CGPoint gestureStartPoint;
static CGFloat const kMinimumGestureLength = ;
static CGFloat const kMaximumVariance = ; #pragma mark - Touch Handling
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
//当前的坐标,第一次触摸
self.gestureStartPoint = [touch locationInView: self.view];
} - (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
//触摸移动时的坐标
CGPoint currentPosition = [touch locationInView: self.view]; //函数fabsf放回一个float类型的绝对值
CGFloat deltaX = fabsf( self.gestureStartPoint.x - currentPosition.x );
CGFloat deltaY = fabsf( self.gestureStartPoint.y - currentPosition.y ); if ( deltaX >= kMinimumGestureLength && deltaY <= kMaximumVariance ) {
//水平移动,这里开始写处理代码
} else if( deltaY >= kMinimumGestureLength && deltaX <= kMaximumVariance ) {
//垂直移动,这里开始写处理代码
} }

4.

IOS 手势-轻点、触摸、手势、事件的更多相关文章

  1. iOS 开发的几种手势

    今天为大家介绍一下IOS 的七种手势,手势在开发中经常用到,所以就简单 通俗易懂的说下, 话不多说,直接看代码: // 初始化一个UIimageView UIImageView *imageView ...

  2. IOS 响应者链条 and UIGestureRecognizer 手势识别器)

    一次完整的触摸事件的传递响应的过程 UIAppliction --> UIWiondw -->递归找到最适合处理事件的控件 控件调用touches方法-->判断是否实现touches ...

  3. iOS全埋点解决方案-手势采集

    前言 ​ 随着科技以及业务的发展,手势的应用也越来越普及,因此对于数据采集,我们要考虑如果通过全埋点来实现手势的采集. 一.手势识别器 ​ 苹果为了降低开发者在手势事件处理方面的开发难度,定义了一个抽 ...

  4. iOS开发系列之触摸事件

    基础知识 三类事件中触摸事件在iOS中是最常用的事件,这里我们首先介绍触摸事件. 在下面的例子中定义一个KCImage,它继承于UIView,在KCImage中指定一个图片作为背景.定义一个视图控制器 ...

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

    Android 触摸手势基础 官方文档概览 触摸手势检测基础 手势检测一般包含两个阶段: 1.获取touch事件数据 2.解析这些数据,看它们是否满足你的应用所支持的某种手势. 相关API: Moti ...

  6. 移动开发框架,Hammer.js&nbsp;移动设备触摸手势js库

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

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

    Android 触摸手势基础 官方文档概览 触摸手势检测基础 手势检测一般包含两个阶段: 1.获取touch事件数据 2.解析这些数据,看它们是否满足你的应用所支持的某种手势. 相关API: Moti ...

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

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

  9. iOS手势学习UIGestureRecognizer & cocos2d 手势推荐

    iOS手势学习UIGestureRecognizer & cocos2d 手势推荐 手势识别类型: UILongPressGestureRecognizer  // 长按UIPanGestur ...

  10. [iOS UI进阶 - 3.2] 手势识别器UIGestureRecognizer

    A.系统提供的手势识别器   1.敲击手势 UITapGestureRecognizer numberOfTapsRequired: 敲击次数 numberOfTouchesRequired: 同时敲 ...

随机推荐

  1. String、StringBuffer、StringBuilder的一些小经验……

    一说String.StringBuffer和StringBuilder,想必大家都很熟悉,这三者经常在我们的面试题中出现,我也是看到了关于这三个的经典面试题,才触动了我之前工作中的一些经历,故而根据我 ...

  2. Windows和linux的文件共享(1)

    今天是我学习linux以来第一次写博客.带着一种激动心情我开始尝试着去完成第一篇博客.从易到难.所以第一次我就主要学习了Windows之间的文件共享. Window之间的文件共享是通过局域网实现的.局 ...

  3. location

    //*******************location对象************************************************************ /*立即打开UR ...

  4. unity3d多线程坑

    单独起了一个线程来处理网络相关操作,比较常规的做法.本身没啥特别的东西,碰到了一个不大不小的坑折腾了好久,记录下来吧. 简单的说就是子线程中抛出的异常,如果没有catch的话,会导致子线程悄无声息的退 ...

  5. hdu acm 1425 sort(哈希表思想)

    sort Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. [UE4]CustomAnimationBlueprintNode 自定义动画蓝图节点

    目的:在AnimationBlueprint中使用自定义动画控制节点. 主要过程: 1.      引用相关模块.在Client.Build.cs文件中,PublicDependencyModuleN ...

  7. Activity劫持实例与防护手段

    原文地址:Activity劫持实例与防护手段 作者:cjxqhhh (本文只用于学习技术,提高大家警觉,切勿用于非法用途!)   什么叫Activity劫持   这里举一个例子.用户打开安卓手机上的某 ...

  8. [原] XAF 如何啟用ListView橫向滾動條

    using System; using DevExpress.ExpressApp; using DevExpress.ExpressApp.Win.Editors; using DevExpress ...

  9. JS设计模式初探

    目的:设计模式众多,尝试用博客记录下学到的不同设计模式的优劣,方便以后查阅. 前言:半年前看高程的时候看到设计模式这章,云里雾里,不是看不明白,而是不明白为啥要如此麻烦只为创建一个对象.直到最近完成了 ...

  10. JS实现雪花效果

    演示效果 http://www.9696e.com/demo/snow/ 春节之前新一博客也会一直挂着的. 加载链接 <script src="http://www.9696e.com ...