一、基本概念与理解:
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的手势与触摸编程学习笔记的更多相关文章

  1. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  2. Linux Shell编程学习笔记——目录(附笔记资源下载)

    LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...

  3. DirectX 11游戏编程学习笔记之8: 第6章Drawing in Direct3D(在Direct3D中绘制)(习题解答)

            本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com         注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候 ...

  4. 多线程编程学习笔记——async和await(一)

    接上文 多线程编程学习笔记——任务并行库(一) 接上文 多线程编程学习笔记——任务并行库(二) 接上文 多线程编程学习笔记——任务并行库(三) 接上文 多线程编程学习笔记——任务并行库(四) 通过前面 ...

  5. 多线程编程学习笔记——async和await(二)

    接上文 多线程编程学习笔记——async和await(一) 三.   对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步 ...

  6. 多线程编程学习笔记——async和await(三)

    接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五.   处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...

  7. 多线程编程学习笔记——使用异步IO(一)

    接上文 多线程编程学习笔记——使用并发集合(一) 接上文 多线程编程学习笔记——使用并发集合(二) 接上文 多线程编程学习笔记——使用并发集合(三) 假设以下场景,如果在客户端运行程序,最的事情之一是 ...

  8. 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端

    接上文 多线程编程学习笔记——使用异步IO 二.   编写一个异步的HTTP服务器和客户端 本节展示了如何编写一个简单的异步HTTP服务器. 1.程序代码如下. using System; using ...

  9. 多线程编程学习笔记——异步调用WCF服务

    接上文 多线程编程学习笔记——使用异步IO 接上文 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端 接上文 多线程编程学习笔记——异步操作数据库 本示例描述了如何创建一个WCF服务,并宿主 ...

随机推荐

  1. sybase参数调整

  2. kvo-观察者-iOS

    #import <Foundation/Foundation.h> @interface Child : NSObject @property (nonatomic,assign) int ...

  3. python_redis之篇

    一.redis基本安装和简单使用 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合) ...

  4. Java基础试题

      1.使用Java语言编写的源程序保存时的文件扩展名是( B ). (A).class          (B).java            (C).cpp            (D).txt ...

  5. html之ol标签

    有序列表,请使用 CSS 来定义列表的类型. 通常和li配对使用 HTML5新属性: compact reversed:降序 start:有序列表的起始值 type:在列表中使用标记类型(1,A,a, ...

  6. java.sql.SQLException: Io 异常: Connection reset

    当数据库连接池中的连接被创建而长时间不使用的情况下,该连接会自动回收并失效,但客户端并不知道,在进行数据库操作时仍然使用的是无效的数据库连接,这样,就导致客户端程序报“ java.sql.SQLExc ...

  7. 200多个js技巧代码

    1.文本框焦点问题 onBlur:当失去输入焦点后产生该事件 onFocus:当输入获得焦点后,产生该文件 Onchange:当文字值改变时,产生该事件 Onselect:当文字加亮后,产生该文件 & ...

  8. jquery 设置select 默认值

    $('#@(Perfix)OrgType').children("option").each(function () { var temp_value = $(this).val( ...

  9. Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法

    Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法 昨天在开发的时候遇到个小问题,就是如何将Grid的内容与Form一起发送到服务器端.默认情况下,表单(F ...

  10. 【python】浅谈encode和decode

    对于encode和decode,笔者也是根据自己的理解,有不对的地方还请多多指点. 编码的理解: 1.编码:utf-8,utf-16,gbk,gb2312,gb18030等,编码为了便于理解,可以把它 ...