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. 配置Chrome Driver

    书中使用Firefox driver出现莫名问题,大概是firefox的版本太新了,懒得降级处理,故学习配置Chome driver进行测试. 1.到http://chromedriver.stora ...

  2. AngularJS学习总结

    第一章  简单认识AngularJS 1.双向数据绑定 可通过ng-model监控输入 ng-app属性声明所有被其包含的内容都属于这个AngularJs应用,这也是我们在web应用中嵌套Angula ...

  3. Tomcat中使用JNDI加载JDBC数据源

    以前写JDBC的时候总是手工写一个类,用硬代码写上className.url.用户名和密码什么的,然后通过DriverManager获取到Connection.那样写是很方便,但是如果想更改的话,需要 ...

  4. 关于PHP堆栈与列队

    在PHP中数组常被当作堆栈(后进先出:LIFO)与队列(先进先出:FIFO)结构来使用.PHP提供了一组函数可以用于push与pop(堆栈)还有shift与unshift(队列)来操作数组元素.堆栈与 ...

  5. struts2 validation.xml 注意点

    1.首先应该注意validation.xml的名字,一定要以Action的类名加“-validation.xml”作为文件名.入LoginAction-validation.xml. 2.LoginA ...

  6. Chrome: Resource interpreted as Font but transferred with MIME type font/x-woff

    最近,项目中加入了Bootstrap进行界面优化,但是,项目加载运行之后,控制台总是提示以下错误信息: GET http://localhost:8080/.../fonts/fontawesome- ...

  7. 创建webservice实例

    http://blog.csdn.net/haiyanstudent/article/details/32148207

  8. Python学习之路—Day1

    第1章 Python语言简介 1.1 Python是什么 Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn)是什么呢?简单的说,它是一种计算机编程语言及一组配套的软件工具和库. ...

  9. Linux系统MySQL开启远程连接

    1.远程连接上Linux系统,确保Linux系统已经安装上了MySQL数据库.登陆数据库.mysql -uroot -p(密码). 2.创建用户用来远程连接 GRANT ALL PRIVILEGES ...

  10. Mac 问题

    1.mac siri有什么用? 语音功能,感觉用处不是特别大 2.mac iphone 复制粘贴 没找到该怎么做. 3.icloud dirver 类似dropbox,不过网络应该不太好,不靠谱.