最近在项目中用到了手势操作,键盘回收时还是挺常用的,现在总结下,多谢网络上大神们的分享。

先分享下我在项目中用的代码:

 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

 
标签:
Objective-C iOS
 

代码片段(5)

[代码] 一个手指,拍击两次手势

01 //
创建一个手势识别器
02 UITapGestureRecognizer
*oneFingerTwoTaps =
03   [[[UITapGestureRecognizer
alloc] initWithTarget:self action:@selector(oneFingerTwoTaps)] autorelease];
04   
05 //
Set required taps and number of touches
06 [oneFingerTwoTaps
setNumberOfTapsRequired:2];
07 [oneFingerTwoTaps
setNumberOfTouchesRequired:1];
08   
09 //
Add the gesture to the view
10 [[self
view] addGestureRecognizer:oneFingerTwoTaps];
11
12 消息方法oneFingerTwoTaps
13 -
(
void)oneFingerTwoTaps
14 {
15   NSLog(@"Action:
One finger, two taps"
);
16 }

[代码] 两个手指,拍击两次手势

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];
06
07 消息方法twoFingersTwoTaps
08 -
(
void)twoFingersTwoTaps
{
09   NSLog(@"Action:
Two fingers, two taps"
);
10 }

[代码] 一个手指向上、向下擦碰手势

01 //
向上擦碰
02 UISwipeGestureRecognizer
*oneFingerSwipeUp =
03   [[[UISwipeGestureRecognizer
alloc] initWithTarget:self action:@selector(oneFingerSwipeUp:)] autorelease];
04 [oneFingerSwipeUp
setDirection:UISwipeGestureRecognizerDirectionUp];
05 [[self
view] addGestureRecognizer:oneFingerSwipeUp];
06
07 -
(
void)oneFingerSwipeUp:(UISwipeGestureRecognizer
*)recognizer
08 {
09   CGPoint
point = [recognizer locationInView:[self view]];
10   NSLog(@"Swipe
up - start location: %f,%f"
,
point.x, point.y);
11 }
12
13 //
向下擦碰
14 UISwipeGestureRecognizer
*oneFingerSwipeDown =
15   [[[UISwipeGestureRecognizer
alloc] initWithTarget:self action:@selector(oneFingerSwipeDown:)] autorelease];
16 [oneFingerSwipeDown
setDirection:UISwipeGestureRecognizerDirectionDown];
17 [[self
view] addGestureRecognizer:oneFingerSwipeDown];
18
19 -
(
void)oneFingerSwipeDown:(UISwipeGestureRecognizer
*)recognizer
20 {
21   CGPoint
point = [recognizer locationInView:[self view]];
22   NSLog(@"Swipe
down - start location: %f,%f"
,
point.x, point.y);
23 }

[代码] 旋转手势

1 UIRotationGestureRecognizer
*twoFingersRotate =
2   [[[UIRotationGestureRecognizer
alloc] initWithTarget:self action:@selector(twoFingersRotate:)] autorelease];
3 [[self
view] addGestureRecognizer:twoFingersRotate];
4
5 -
(
void)twoFingersRotate:(UIRotationGestureRecognizer
*)recognizer
6 {
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));
9 }

[代码] 向里或向外捏的手势

1 UIPinchGestureRecognizer
*twoFingerPinch =
2   [[[UIPinchGestureRecognizer
alloc] initWithTarget:self action:@selector(twoFingerPinch:)] autorelease];
3 [[self
view] addGestureRecognizer:twoFingerPinch];
4
5 -
(
void)twoFingerPinch:(UIPinchGestureRecognizer
*)recognizer
6 {
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

最新文章

  1. 开源服务专题之------ssh防止暴力破解及fail2ban的使用方法
  2. Python 常用模块之time&datetime 和random
  3. checkbox实现互斥
  4. 制作Html标签以及表单、表格内容
  5. Linux 信号量大全
  6. mysql 的2个关于事务和安全性的参数
  7. sql 游标例子 根据一表的数据去筛选另一表的数据
  8. mysql索引常见问题
  9. clock_gettime的使用,计时比clock()精确
  10. 以字符串形式读取github上.json文件
  11. Output Limit Exceed是什么情况引起的
  12. [复习]java中hashCode的作用
  13. 软件开发的一些"心法"
  14. dojo API中英文缩写的意思
  15. 浏览器中直接是使用react系列包开发,非打包方式。
  16. 判断字符串的后缀.endswith()
  17. 深入理解Java虚拟机04--类结构文件
  18. DataGridView常用属性和方法
  19. python的requests模块爬取网页内容
  20. [How to]集成SQLite3

热门文章

  1. UNDERSTANDING POSTGRESQL.CONF: CHECKPOINT_SEGMENTS, CHECKPOINT_TIMEOUT, CHECKPOINT_WARNING
  2. WCF Client is Open Source
  3. comet基于HTTP长连接技术(java即时通信,推送技术详解)
  4. Zabbix 教程
  5. javascript 对象中的 handleEvent
  6. shopex用户登陆错误提示在nginx下乱码问题
  7. 【linux】ps 命令详解
  8. jQuery实现登录提示
  9. Partition does not end on cylinder boundary
  10. Redis报错:WRONGTYPE Operation against a key holding the wrong kind of value 解决处理