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. 对button或radiobutton制作样式

    制作样式在drawable中进行 (cheakbox)在样式中点击变换图片,<selector> <item android:state_checked="true&quo ...

  2. XML解析、使用TreeView呈现效果

    首先用到TXMLDocument控件: Memo来显示XML文件, TreeView来呈现元素: 源代码: Procedure TForm2.Button1Click(Sender: TObject) ...

  3. 使用C#代码部署SharePoint 2013开发包简单总结(一)

    这篇文章将总结下如何将自己开发的列表.Web部件.事件接收器等元素部署到SharePoint的服务器.因水平有限,我的做法未必是最佳实践,会有些错误理解和疏漏,欢迎各位高手批评指正——但一定要能给出更 ...

  4. 关于Java深clone 的例子学习

    之前http://www.cnblogs.com/lhppom/p/4857702.html里有提到关于Java的深克隆的学习,深浅区别就是在于仅复制对象引用和复制对象引用所指向的对象,最近在看< ...

  5. mysql注入读写文件

    mysql <5.0 读文件:load_file() sql-shell select load_file(''); d:/www/xx/index.php /home/webroot/.... ...

  6. js queue dequeue clearQueue stop

      一.queue( [queueName ], newQueue ) 操作欲执行队列方法 第一个参数是队列名称,不写的话默认是fx 第二个参数可以是一个函数数组,存放所有队列函数,也可以是一个回掉函 ...

  7. backbone框架思路

    Backbone是MVC框架.如何使用这个框架来简化前端过程呢?作为一个初学者,虽然网上有它的官方文档,但是都是讲的一些方法,思路分析的却对初学者来说,看得晕乎乎的.现在就把自己对这个框架的理解记录在 ...

  8. [Python] Pitfalls: About Default Parameter Values in Functions

    Today an interesting bug (pitfall) is found when I was trying debug someone's code. There is a funct ...

  9. OPC的理解Open Packaging Conventions

    Open Packaging Conventions (OPC) 博客地址:www.cnblogs.com/icmzn OPC是一个文件容器技术.被微软创建,用来存储XML或者非XML文件结合起来的规 ...

  10. 教你如何快速下载旧版本的Firefox浏览器

    http://blog.csdn.net/gh0st007/article/details/18937421 更新后的ff使用过程中经常出现卡顿的现象,之前并没有出现,于是想找老版本的ff安装一下.发 ...