最近在项目中用到了手势操作,键盘回收时还是挺常用的,现在总结下,多谢网络上大神们的分享。
先分享下我在项目中用的代码:
 UITapGestureRecognizer * mytap=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap_gestureRecognizer:)];
     [self addGestureRecognizer:mytap];
     [mytap release];
 //收回键盘
 -(void)tap_gestureRecognizer:(UITapGestureRecognizer *)tap_gest
 {
     [self.scv_stockPriceTextField resignFirstResponder];
     [self.scv_stockAmoutTextField resignFirstResponder];
 }
 
//单指单击
2: UITapGestureRecognizer *singleFingerOne = [[UITapGestureRecognizer alloc] initWithTarget:self
3: action:@selector(handleSingleFingerEvent:)];
4: singleFingerOne.numberOfTouchesRequired = 1; //手指数
5: singleFingerOne.numberOfTapsRequired = 1; //tap次数
6: singleFingerOne.delegate = self;
7:
8: //单指双击
9: UITapGestureRecognizer *singleFingerTwo = [[UITapGestureRecognizer alloc] initWithTarget:self
10: action:@selector(handleSingleFingerEvent:)];
11: singleFingerTwo.numberOfTouchesRequired = 1;
12: singleFingerTwo.numberOfTapsRequired = 2;
13: singleFingerTwo.delegate = self;
14:
15: //双指单击
16: UITapGestureRecognizer *doubleFingerOne = [[UITapGestureRecognizer alloc] initWithTarget:self
17: action:@selector(handleDoubleFingerEvent:)];
18: doubleFingerOne.numberOfTouchesRequired = 2;
19: doubleFingerOne.numberOfTapsRequired = 1;
20: doubleFingerOne.delegate = self;
21:
22: UITapGestureRecognizer *doubleFingerTwo = [[UITapGestureRecognizer alloc] initWithTarget:self
23:    action:@selector(handleDoubleFingerEvent:)];
24: doubleFingerTwo.numberOfTouchesRequired = 2;
25: doubleFingerTwo.numberOfTapsRequired = 2;
26: doubleFingerTwo.delegate = self;
27:
28: //如果不加下面的话,当单指双击时,会先调用单指单击中的处理,再调用单指双击中的处理
29: [singleFingerOne requireGestureRecognizerToFail:singleFingerTwo];
30: //同理双指亦是如此
31: [doubleFingerOne requireGestureRecognizerToFail:doubleFingerTwo];
32:
33: [self.view addGestureRecognizer:singleFingerOne];
34: [self.view addGestureRecognizer:singleFingerTwo];
35: [self.view addGestureRecognizer:doubleFingerOne];
36: [self.view addGestureRecognizer:doubleFingerTwo];
37:
38: [singleFingerOne release];
39: [singleFingerTwo release];
40: [doubleFingerOne release];
41: [doubleFingerTwo release];
处理事件的方法,代码:
1: //处理单指事件
2: - (void)handleSingleFingerEvent:(UITapGestureRecognizer *)sender
3: {
4: if (sender.numberOfTapsRequired == 1) {
5: //单指单击
6: NSLog(@"单指单击");
7: }else if(sender.numberOfTapsRequired == 2){
8: //单指双击
9: NSLog(@"单指双击");
10: }
11: }
12: //处理双指事件
13: - (void)handleDoubleFingerEvent:(UITapGestureRecognizer *)sender
14: {
15: if (sender.numberOfTapsRequired == 1) {
16: //双指单击
17: NSLog(@"双指单击");
18: }else if(sender.numberOfTapsRequired == 2){
19: //双指双击
20: NSLog(@"双指双击");
21: }
22: }
 
将相应代码复制到你的工程中即可使用,由于代码中已经有详细的解释说明,这里就不在重复解释了。
代码中只是列举了单指与双指对于单击或多击的处理,同理多指的操作需修改numberOfTouchesRequired属性,对点击的次数需修改numberOfTapsRequired属性。
对于其他手势例如UISwipeGestureRecognizer,UILongPressGestureRecognizer,UILongPressGestureRecognizer的操作使用类似处理。
 UIKit中包含了UIGestureRecognizer类,用于检测发生在设备中的手势。UIGestureRecognizer是一个抽象类,定义了所有手势的基本行为,它有下面一些子类用于处理具体的手势:
1、拍击UITapGestureRecognizer (任意次数的拍击)  
    2、向里或向外捏UIPinchGestureRecognizer (用于缩放)  
    3、摇动或者拖拽UIPanGestureRecognizer  
    4、擦碰UISwipeGestureRecognizer (以任意方向)  
    5、旋转UIRotationGestureRecognizer (手指朝相反方向移动)  
    6、长按UILongPressGestureRecognizer
对于不同类型的手势识别器,具有不同的配置属性。比如UITapGestureRecognizer,可以配置拍击次数。界面接收到手势之后,可以发送一
个消息,用于处理响应手势动作后的任务。当然,不同的手势识别器,发送的消息方法也会有所不同。下面列举几个具体示例代码: 
http://www.ctolive.com/space-1023-do-blog-id-2107.html
 
 
 
 
[代码] 一个手指,拍击两次手势
02 | 
UITapGestureRecognizer 
 *oneFingerTwoTaps = | 
 
03 | 
  [[[UITapGestureRecognizer 
 alloc] initWithTarget:self action:@selector(oneFingerTwoTaps)] autorelease]; | 
 
05 | 
// 
 Set required taps and number of touches | 
 
06 | 
[oneFingerTwoTaps 
 setNumberOfTapsRequired:2]; | 
 
07 | 
[oneFingerTwoTaps 
 setNumberOfTouchesRequired:1]; | 
 
09 | 
// 
 Add the gesture to the view | 
 
10 | 
[[self 
 view] addGestureRecognizer:oneFingerTwoTaps]; | 
 
13 | 
- 
 (void)oneFingerTwoTaps | 
 
15 | 
  NSLog(@"Action: 
 One finger, two taps"); | 
 
 
 
 
[代码] 两个手指,拍击两次手势
01 | 
UITapGestureRecognizer 
 *twoFingersTwoTaps = | 
 
02 | 
  [[[UITapGestureRecognizer 
 alloc] initWithTarget:self action:@selector(twoFingersTwoTaps)] autorelease]; | 
 
03 | 
[twoFingersTwoTaps 
 setNumberOfTapsRequired:2]; | 
 
04 | 
[twoFingersTwoTaps 
 setNumberOfTouchesRequired:2]; | 
 
05 | 
[[self 
 view] addGestureRecognizer:twoFingersTwoTaps]; | 
 
08 | 
- 
 (void)twoFingersTwoTaps 
 { | 
 
09 | 
  NSLog(@"Action: 
 Two fingers, two taps"); | 
 
 
 
 
[代码] 一个手指向上、向下擦碰手势
02 | 
UISwipeGestureRecognizer 
 *oneFingerSwipeUp = | 
 
03 | 
  [[[UISwipeGestureRecognizer 
 alloc] initWithTarget:self action:@selector(oneFingerSwipeUp:)] autorelease]; | 
 
04 | 
[oneFingerSwipeUp 
 setDirection:UISwipeGestureRecognizerDirectionUp]; | 
 
05 | 
[[self 
 view] addGestureRecognizer:oneFingerSwipeUp]; | 
 
07 | 
- 
 (void)oneFingerSwipeUp:(UISwipeGestureRecognizer 
 *)recognizer | 
 
09 | 
  CGPoint 
 point = [recognizer locationInView:[self view]]; | 
 
10 | 
  NSLog(@"Swipe 
 up - start location: %f,%f", 
 point.x, point.y); | 
 
14 | 
UISwipeGestureRecognizer 
 *oneFingerSwipeDown = | 
 
15 | 
  [[[UISwipeGestureRecognizer 
 alloc] initWithTarget:self action:@selector(oneFingerSwipeDown:)] autorelease]; | 
 
16 | 
[oneFingerSwipeDown 
 setDirection:UISwipeGestureRecognizerDirectionDown]; | 
 
17 | 
[[self 
 view] addGestureRecognizer:oneFingerSwipeDown]; | 
 
19 | 
- 
 (void)oneFingerSwipeDown:(UISwipeGestureRecognizer 
 *)recognizer | 
 
21 | 
  CGPoint 
 point = [recognizer locationInView:[self view]]; | 
 
22 | 
  NSLog(@"Swipe 
 down - start location: %f,%f", 
 point.x, point.y); | 
 
 
 
 
[代码] 旋转手势
1 | 
UIRotationGestureRecognizer 
 *twoFingersRotate = | 
 
2 | 
  [[[UIRotationGestureRecognizer 
 alloc] initWithTarget:self action:@selector(twoFingersRotate:)] autorelease]; | 
 
3 | 
[[self 
 view] addGestureRecognizer:twoFingersRotate]; | 
 
5 | 
- 
 (void)twoFingersRotate:(UIRotationGestureRecognizer 
 *)recognizer | 
 
7 | 
  // 
 Convert the radian value to show the degree of rotation | 
 
8 | 
  NSLog(@"Rotation 
 in degrees since last change: %f", 
 [recognizer rotation] * (180 / M_PI)); | 
 
 
 
 
[代码] 向里或向外捏的手势
1 | 
UIPinchGestureRecognizer 
 *twoFingerPinch = | 
 
2 | 
  [[[UIPinchGestureRecognizer 
 alloc] initWithTarget:self action:@selector(twoFingerPinch:)] autorelease]; | 
 
3 | 
[[self 
 view] addGestureRecognizer:twoFingerPinch]; | 
 
5 | 
- 
 (void)twoFingerPinch:(UIPinchGestureRecognizer 
 *)recognizer | 
 
7 | 
   NSLog(@"Pinch 
 scale: %f", 
 recognizer.scale); 
} 
 | 
 
在 iPhone 或 iPad 的开发中,除了用 touchesBegan / touchesMoved / touchesEnded 这组方法来控制使用者的手指触控外,也可以用 UIGestureRecognizer 的衍生类別来进行判断。用 UIGestureRecognizer 的好处在于有现成的手势,开发者不用自己计算手指移动轨迹。UIGestureRecognizer的衍生类別有以下几种:
- UITapGestureRecognizer
 
- UIPinchGestureRecognizer
 
- UIRotationGestureRecognizer
 
- UISwipeGestureRecognizer
 
- UIPanGestureRecognizer
 
- UILongPressGestureRecognizer
 
从命名上不难了解這些类別所对应代表的手势,分別是
 Tap(点一下)、Pinch(二指往內或往外拨动)、Rotation(旋转)、Swipe(滑动,快速移动)、Pan (拖移,慢速移动)以及 LongPress(长按)。這些手势別在使用上也很简单,只要在使用前定义并添加到对应的视图上即可。
// 定义一个 recognizer, 并加到需要偵測该手势的 UIView 元件上
- (void)viewDidLoad {
    UISwipeGestureRecognizer* recognizer;
    // handleSwipeFrom 是偵測到手势,所要呼叫的方法
    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:selfaction:@selector(handleSwipeFrom)];
    // 不同的 Recognizer 有不同的实体变数
    // 例如 SwipeGesture 可以指定方向
    // 而 TapGesture 則可以指定次數
    recognizer.direction = UISwipeGestureRecognizerDirectionUp
    [self.view addGestureRecognizer:recognizer];
    [recognizer release];
 }
 - (void)handleSwipeFrom:(UISwipeGestureRecognizer*)recognizer {
    // 触发手勢事件后,在这里作些事情
    // 底下是刪除手势的方法
    [self.view removeGestureRecognizer:recognizer];
 }
 
 
 
 
 
 
问题來了。有些手势其实是互相关联的,例如 Tap 与 LongPress、Swipe与 Pan,或是 Tap 一次与Tap 兩次。当一個 UIView 同时添加兩个相关联的手势时,到底我这一下手指头按的要算是 Tap 还是 LongPress?如果照預设作法来看,只要「先滿足条件」的就会跳出并呼叫对应方法,举例来说,如果同时注册了 Pan 和 Swipe,只要手指头一移动就会触发 Pan 然后跳出,因而永远都不會发生 Swipe;单点与双点的情形也是一样,永远都只会触发单点,不會有双点。
那么这个问题有解吗?答案是肯定的,UIGestureRecognizer 有个方法叫做requireGestureRecognizerToFail,他可以指定某一个
 recognizer,即便自己已经滿足條件了,也不會立刻触发,会等到该指定的 recognizer 确定失败之后才触发。以同时支持单点与双点的手势为例,代码如下:
- (void)viewDidLoad {
    // 单击的 Recognizer
    UITapGestureRecognizer* singleRecognizer;
    singleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:selfaction:@selector(handleSingleTapFrom)];
    singleTapRecognizer.numberOfTapsRequired = 1; // 单击
    [self.view addGestureRecognizer:singleRecognizer];
    // 双击的 Recognizer
    UITapGestureRecognizer* double;
    doubleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:selfaction:@selector(handleDoubleTapFrom)];
    doubleTapRecognizer.numberOfTapsRequired = 2; // 双击
    [self.view addGestureRecognizer:doubleRecognizer];
    // 关键在这一行,如果双击确定偵測失败才會触发单击
    [singleRecognizer requireGestureRecognizerToFail:doubleRecognizer];
    [singleRecognizer release];
    [doubleRecognizer release];
}
 
 
 
 
 
 
 
来源:http://blog.csdn.net/xiaoxuan415315/article/details/7788239
												
												
								- UITapGestureRecognizer 的用法(轻触手势识别器)
		
最近在项目中用到了手势操作,键盘回收时还是挺常用的,现在总结下,多谢网络上大神们的分享. 先分享下我在项目中用的代码: UITapGestureRecognizer * mytap=[[UITapGe ...
		 
						- ISO给UIImageView增加点击事件
		
自己做了一个九宫格,里面的图标都是由多张图片重叠构成,然后包装成一个button来使用: 遇到的问题是如何给这个“button”增加点击事件? 解决思路1:网友提示在该“button”上增加一个真正的 ...
		 
						- 【IOS实例小计】UIImageView
		
预备知识: UIImage 是一个专门存储图片数据的对象,默认兼容的图片格式是 PNG,可以通过文件.Quartz image对象或 image Data数据得到一个图片对象. UIImage相关功能 ...
		 
						- iOS的触摸事件的用法以及和手势识别器的区别
		
1.首先来介绍下触摸事件和手势识别器的利与弊 触摸事件和手势识别器二者之间有直接的关系 手势识别器是在触摸事件的基础上演变过来的 当我们用到触摸事件时 默认的uiview是没有什么效果的 只能自定义v ...
		 
						- iOS基础篇(十七)——UIGestureRecognizer用法
		
UIGestureRecognizer(手势识别)在iOS 中非常重要,他极大地提高了移动设备的使用便捷性: 在3.2之前是主要使用的是由UIResponder而来的如下4种方式: - (void)t ...
		 
						- ios开发 <AppName>-Prefix.pch文件的用法详解
		
我们知道,每新建立一个工程,比如说HelloWord,在分类SupportingFiles里都会有一个以工程名开头-Prefix.pch结尾的文件,如HelloWord-Prefix.pch.对于这个 ...
		 
						- iOS中Block的用法,举例,解析与底层原理(这可能是最详细的Block解析)
		
1. 前言 Block:带有自动变量(局部变量)的匿名函数.它是C语言的扩充功能.之所以是拓展,是因为C语言不允许存在这样匿名函数. 1.1 匿名函数 匿名函数是指不带函数名称函数.C语言中,函数是怎 ...
		 
						- EditText 基本用法
		
title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...
		 
						- jquery插件的用法之cookie 插件
		
一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...
		 
		
	
随机推荐
	
									- Apache模块 mod_proxy 转自http://www.php100.com/manual/apache2/mod/mod_proxy.html
			
Apache模块 mod_proxy 说明 提供HTTP/1.1的代理/网关功能支持 状态 扩展(E) 模块名 proxy_module 源文件 mod_proxy.c 概述 警告 在您没有对服务器采 ...
			 
						- loadrunner---<二>---菜鸟对cookie的思考
			
http://www.cnblogs.com/Pierre-de-Ronsard/archive/2012/11/19/2772630.html loadrunner---<二>---菜鸟 ...
			 
						- Python列表操作——模拟实现栈和队列
			
1.实现栈: stack=[] def pushit(): stack.append(raw_input('Enter New String:').strip()) def popit(): if l ...
			 
						- USACO/friday
			
Friday the Thirteenth 黑色星期五 描述 13号又是一个星期五.13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数.给出N年的 ...
			 
						- OpenJudge计算概论-扩号匹配问题【这个用到了栈的思想】
			
/*====================================================================== 扩号匹配问题 总时间限制: 1000ms 内存限制:  ...
			 
						- kubernetes  centos   安装
			
1.  安装       yum install -y  etcd  kubernetes   2.  配置         docker             /etc/sysconfig/doc ...
			 
						- Postman接口测试初探
			
Postman接口测试 有两种安装方式: 1)Chrome插件(https://www.getpostman.com/).安装完成后,它会在chrome的应用中,如下图 2)通过下载Native ap ...
			 
						- PCA的数学原理
			
PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维 数据的 ...
			 
						- 《中日韩联合开发 - Asianux Server 3》(Asianux Server 3.0)[ISO]
			
中文名: 中日韩联合开发 - Asianux Server 3英文名: Asianux Server 3.0资源格式: 光盘镜像发行时间: 2007年制作发行: 红旗软件(中国)MiracleLinu ...
			 
						- Eclipse中新建jsp文件访问页面时乱码问题
			
新建.jsp文件,charset和pageEncoding默认是ISO-8859-1,这样的话访问页面时会出现乱码,解决办法:将charset和pageEncoding改为UTF-8(或者GBK/GB ...