iphone的手势与触摸编程学习笔记
一、基本概念与理解:
Cocoa Touch将触摸事件发送到正在处理的视图。触摸传达的信息包括:
- 触摸发生的位置 (当前位置、最近的历史位置)
- 触摸的阶段 (按下、移动、弹起)
- 轻击数量 (tapCount 单击/双击)
- 触摸发生时间 (时间戳)
每个UITouch对象都代表一个触摸事件。在iPhone中,触摸交互遵循一种原始的设计模式,即在UIView类中而非UIViewController类中编程实现。就是说触摸交互采用视图级编程方式。
如何触摸的,即所谓的基本手势,包括:
- Swipe:滑过,快速移动
- Pinch Open:二指往外拨动
- Pinch Close:二指往内拨动
- Tap:轻击
- Touch and hold:长按
这些手势的具体实现最原始的(相对最新的iOS版本)就是通过4个视图方法自定义编程来实现。
二、 触摸和视图方法——自定义手势编程
预定义的4个回调方法就是处理屏幕上触摸的开始、移动和结束。
当用户开始触摸屏幕时,在事件的开始阶段被调用——touchesBegan: withEvent:
处理手指的移动——touchesMoved: withEvent:
当手指离开屏幕时,结束触摸过程——touchesEnded: withEvent:
必须响应持续触摸事件的系统中断时调用——touchesCancelled: withEvent:
这4个方法都是一种UIResponder方法,通常在UIView子类中实现。所有视图继承了这些方法的基本版本。示例:自定义一个Tickle(类似划卡)手势。

// TickleGestureRecognizer.h
// #import <UIKit/UIKit.h> typedef enum {
DirectionUnknown = 0,
DirectionLeft,
DirectionRight
} Direction; @interface TickleGestureRecognizer : UIGestureRecognizer @property (assign) int tickleCount;
@property (assign) CGPoint curTickleStart;
@property (assign) Direction lastDirection; @end


//
// TickleGestureRecognizer.m
// #import "TickleGestureRecognizer.h"
#import <UIKit/UIGestureRecognizerSubclass.h> #define REQUIRED_TICKLES 2
#define MOVE_AMT_PER_TICKLE 25 @implementation TickleGestureRecognizer
@synthesize tickleCount;
@synthesize curTickleStart;
@synthesize lastDirection; - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
self.curTickleStart = [touch locationInView:self.view];
} - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint ticklePoint = [touch locationInView:self.view];
CGFloat moveAmt = ticklePoint.x - curTickleStart.x;
Direction curDirection;
if (moveAmt < 0) {
curDirection = DirectionLeft;
}else{
curDirection = DirectionRight;
}
if (ABS(moveAmt) < MOVE_AMT_PER_TICKLE) return; // Make sure we've switched directions
if (self.lastDirection == DirectionUnknown || (self.lastDirection == DirectionLeft && curDirection == DirectionRight) || (self.lastDirection == DirectionRight && curDirection == DirectionRight)) { self.tickleCount++;
self.curTickleStart = ticklePoint;
self.lastDirection = curDirection; if (self.state == UIGestureRecognizerStatePossible && self.tickleCount > REQUIRED_TICKLES) {
[self setState:UIGestureRecognizerStateEnded];
}
}
} - (void)reset {
self.tickleCount = 0;
self.curTickleStart = CGPointZero;
self.lastDirection = DirectionUnknown;
if (self.state == UIGestureRecognizerStatePossible) {
[self setState:UIGestureRecognizerStateFailed];
}
} - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[self reset];
} - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
[self reset];
} @end

其中方法locationInView:即获取当前Touch点位置。若是获取触摸动作之前的位置则用previousLocationInView:方法。以上定义了一个TickleGestureRecognizer新类实现了Tickle手势。具体使用则是:

// 要用手势的UIView的控制器头文件中添加
- (void)handleTickle:(TickleGestureRecognizer *)recognizer; // 要用手势的UIView的控制器实现文件
// viewDidLoad添加
TickleGestureRecognizer *recognizer = [[TickleGestureRecognizer alloc] initWithTarget:self action:@selector(handleTickle:)];
recognizer.delegate = self; // 又见强大的委托
[view addGestureRecognizer:recognizer]; // 用addGestureRecognizer方法将手势添加到视图上 // 委托的回调方法
- (void)handleTickle:(TickleGestureRecognizer *)recognizer {
// Code.....
}

三、利用UIGestureRecognizer类给视图添加手势
iOS3.0后引入了UIGestueRecognizer类帮助我们处理触摸动作下各种手势的添加实现。要点就是在要添加手势的视图的控制器类必须实现UIGestureRecognizerDelegate委托协议。其实从编码角度看,就是苹果公司将所有的基本手势由UIGestureRecognizer类来定义实现了(与自定义编程中的TickleGestureRecognizer异曲同工)并引入的委托机制。
四、iOS5.0中可以在StoryBoard Editor中可视化添加手势
来源:http://www.cnblogs.com/lovecode/archive/2011/12/08/2281232.html
iphone的手势与触摸编程学习笔记的更多相关文章
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- Linux Shell编程学习笔记——目录(附笔记资源下载)
LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...
- DirectX 11游戏编程学习笔记之8: 第6章Drawing in Direct3D(在Direct3D中绘制)(习题解答)
本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com 注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候 ...
- 多线程编程学习笔记——async和await(一)
接上文 多线程编程学习笔记——任务并行库(一) 接上文 多线程编程学习笔记——任务并行库(二) 接上文 多线程编程学习笔记——任务并行库(三) 接上文 多线程编程学习笔记——任务并行库(四) 通过前面 ...
- 多线程编程学习笔记——async和await(二)
接上文 多线程编程学习笔记——async和await(一) 三. 对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步 ...
- 多线程编程学习笔记——async和await(三)
接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五. 处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...
- 多线程编程学习笔记——使用异步IO(一)
接上文 多线程编程学习笔记——使用并发集合(一) 接上文 多线程编程学习笔记——使用并发集合(二) 接上文 多线程编程学习笔记——使用并发集合(三) 假设以下场景,如果在客户端运行程序,最的事情之一是 ...
- 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端
接上文 多线程编程学习笔记——使用异步IO 二. 编写一个异步的HTTP服务器和客户端 本节展示了如何编写一个简单的异步HTTP服务器. 1.程序代码如下. using System; using ...
- 多线程编程学习笔记——异步调用WCF服务
接上文 多线程编程学习笔记——使用异步IO 接上文 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端 接上文 多线程编程学习笔记——异步操作数据库 本示例描述了如何创建一个WCF服务,并宿主 ...
随机推荐
- Python-描述符
Python中包含了许多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装饰器(decorator).对于大部分特性来说,这些“中级”的语 ...
- 解析C#中[],List,Array,ArrayList的区别及应用
[] 是针对特定类型.固定长度的. List 是针对特定类型.任意长度的. Array 是针对任意类型.固定长度的. ArrayList 是针对任意类型.任意长度的. Array 和 ArrayLis ...
- Integer.parseInt()和Integer.valueOf()有什么区别
jdk的源代码的时候注意到Integer.parseInt(s) 和 Integer.valueOf(s)的具体代码的实现有所区别: Java代码 public static int parseInt ...
- Python_Day6_反射_正则表达式之篇
一.反射 定义:利用字符串形式去对象(模块)中操作(寻找/检查/删除/设置)成员 #getattr:获取模块中属性 #hasattr:检查模块中是否存在某个成员(函数) #delattr:删除模块中成 ...
- Sublime Text3注册码 (备用)
复制如下三个任意一个正版注册码即可—– BEGIN LICENSE —–Andrew WeberSingle User LicenseEA7E-855605813A03DD 5E4AD9E6 6C0E ...
- 使用定时器实现JavaScript的延期执行或重复执行
使用定时器实现JavaScript的延期执行或重复执行 window 对象提供了两个方法来实现定时器的效果,分别是window.setTimeout()和 window.setInterval.其中前 ...
- Nginx Google 扩展
安装配置详见: https://github.com/cuber/ngx_http_google_filter_module/blob/master/README.zh-CN.md tenginx详见 ...
- 分布式服务框架:Zookeeper
Zookeeper是一个高性能,分布式的,开源分布式应用协调服务.它提供了简单原始的功能,分布式应用可以基于它实现更高级的服务,比如同步,配置管理,集群管理,名空间.它被设计为易于编程,使用文件系统目 ...
- SQL集合运算参考及案例(二):树形节点数量逐级累计汇总
问题描述: 我们经常遇到这样一个问题,类似于面对一个树形结构的物料数据,需要将库存中每一种物料数量汇总到物料上展示出来:或者说组织机构是一棵树,我们需要统计每一个节点上的人员数量(含下级节点的累计数量 ...
- CSharp 调用存储过程来执行增、删、改操作
对表进行增,删,改数据时,每次都需要访问一次数据库,这样会影响性能:如果把查询的数据拼接成XML形式,作为一个参数整体传给存储过程来处理,这只访问数据库一次,执行速度会快很多. 1.CSharp 代码 ...