首页 > 代码库 > 触摸事件和手势(UITouch)
触摸事件和手势(UITouch)
概要
本章主要简示了IOS里面的触摸手势部分,触摸分为:开始触摸、移动、结束、取消,四个部分,本章主要根据这四个方法的信息监测触摸手势,按自己理解的,不知道正确的是怎么识别的,以后可以去对比对比,看和这里的方法有什么不同的地方。
结果展示
流程概要
1.因为触摸事件是逐渐向上层传递的,所以可以直接在UIView里面处理,也可以在UIViewController里面处理,本例子在控制类处理;
2.先在处理的四个方法里面打印触摸的信息,感受一下触摸动作对应的触摸信息及事件;
3.本例子使用cancelPreviousPerformRequestsWithTarget方法取消延迟调用performSelector,可以记一下该类型的使用
主要代码
h文件
// // ViewController.h // TouchDetect // // Created by God Lin on 14/12/16. // Copyright (c) 2014年 arbboter. All rights reserved. // #import <UIKit/UIKit.h> typedef enum { TOUCH_TYPE_CLICK, // 单击 TOUCH_TYPE_DBCLICK, // 双击 TOUCH_TYPE_MOVE_LEFT, // 左滑 TOUCH_TYPE_MOVE_RIGHT, // 右滑 TOUCH_TYPE_MOVE_TOP, // 上滑 TOUCH_TYPE_MOVE_BOTTOM, // 下滑 TOUCH_TYPE_ZOOM_IN, // 缩小 TOUCH_TYPE_ZOOM_OUT, // 放大 TOUCH_TYPE_TOUCH_ON // 长按 }TOUCH_TYPE; @interface ViewController : UIViewController { BOOL _bZoom; CGPoint _lastPoint; CGFloat _fLastDistance; TOUCH_TYPE _eTouchType; UITextField* _textBox; } @property (nonatomic, readwrite) BOOL _bZoom; @property (nonatomic, readwrite) CGFloat _fLastDistance; @property (nonatomic, readwrite) CGPoint _lastPoint; @property (nonatomic, readwrite) TOUCH_TYPE _eTouchType; @property (nonatomic, retain) UITextField* _textBox; @end
m文件
// // ViewController.m // TouchDetect // // Created by God Lin on 14/12/16. // Copyright (c) 2014年 arbboter. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController @synthesize _bZoom; @synthesize _fLastDistance; @synthesize _eTouchType; @synthesize _textBox; @synthesize _lastPoint; - (void)printTouch:(UIEvent *)event { #if 0 NSSet* touchs = [event allTouches]; CGPoint viewPoint; CGPoint screenPoint; NSLog(@"touch count = %lu", (unsigned long)touchs.count); for (UITouch* touch in touchs) { viewPoint = [touch locationInView:self.view]; screenPoint = [touch locationInView:nil]; NSLog(@"view position : [%.2f, %.2f]", viewPoint.x, viewPoint.y); NSLog(@"screen position : [%.2f, %.2f]", screenPoint.x, screenPoint.y); NSLog(@"tab count : %ld", touch.tapCount); NSLog(@"tab phase : %ld", touch.phase); NSLog(@"tab timestamp : %f", touch.timestamp); } #endif } - (void)showTouchType { #if 0 NSArray* array = [[NSArray alloc] initWithObjects:@"TOUCH_TYPE_CLICK", @"TOUCH_TYPE_DBCLICK", @"TOUCH_TYPE_MOVE_LEFT", @"TOUCH_TYPE_MOVE_RIGHT", @"TOUCH_TYPE_MOVE_TOP", @"TOUCH_TYPE_MOVE_BOTTOM", @"TOUCH_TYPE_ZOOM_IN", @"TOUCH_TYPE_ZOOM_OUT", @"TOUCH_TYPE_TOUCH_ON", nil]; NSString* strMsg = [[NSString alloc] initWithFormat:@"Touch type : %@", [array objectAtIndex:(NSUInteger)_eTouchType]]; UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Infomation" message:strMsg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; [alert release]; [strMsg release]; [array release]; #else NSLog(@"touch type : %d",_eTouchType); CGFloat x = _textBox.frame.origin.x; CGFloat y = _textBox.frame.origin.y; CGFloat w = _textBox.frame.size.width; CGFloat h = _textBox.frame.size.height; switch (_eTouchType) { case TOUCH_TYPE_DBCLICK: if(_bZoom) { w += 10; h += 10; } else { w -= 10; h -= 10; } _bZoom = !_bZoom; break; case TOUCH_TYPE_ZOOM_OUT: w += 10; h += 10; break; case TOUCH_TYPE_ZOOM_IN: w -= 10; h -= 10; break; case TOUCH_TYPE_MOVE_BOTTOM: y += 10; break; case TOUCH_TYPE_MOVE_TOP: y -= 10; break; case TOUCH_TYPE_MOVE_LEFT: x -= 10; break; case TOUCH_TYPE_MOVE_RIGHT: x += 10; break; default: break; } _textBox.frame = CGRectMake(x, y, w, h); #endif } #pragma touch events - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"touchesBegan"); [self printTouch:event]; CGPoint point1; CGPoint point2; NSArray* arrayTouchs = [[event allTouches] allObjects]; UITouch* touch1 = nil; UITouch* touch2 = nil; switch (arrayTouchs.count) { case 1: { touch1 = [arrayTouchs objectAtIndex:0]; if(touch1.tapCount == 1) { _eTouchType = TOUCH_TYPE_CLICK; [self performSelector:@selector(showTouchType) withObject:self afterDelay:0.3]; } else { _eTouchType = TOUCH_TYPE_DBCLICK; [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(showTouchType) object:self]; [self showTouchType]; } _lastPoint = [touch1 locationInView:self.view]; } break; case 2: { touch1 = [arrayTouchs objectAtIndex:0]; point1 = [touch1 locationInView:self.view]; touch2 = [arrayTouchs objectAtIndex:1]; point2 = [touch2 locationInView:self.view]; CGFloat x = point1.x - point2.x; CGFloat y = point1.y - point2.y; _fLastDistance = sqrt(x*x + y*y); } break; default: break; } } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"touchesMoved"); [self printTouch:event]; [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(showTouchType) object:self]; } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"touchesEnded"); [self printTouch:event]; CGPoint point1; CGPoint point2; NSArray* arrayTouchs = [[event allTouches] allObjects]; UITouch* touch1 = nil; UITouch* touch2 = nil; switch (arrayTouchs.count) { // 滑动 case 1: { touch1 = [arrayTouchs objectAtIndex:0]; point1 = [touch1 locationInView:self.view]; CGFloat xMove = point1.x - _lastPoint.x; CGFloat yMove = point1.y - _lastPoint.y; if(ABS(xMove)>10 || ABS(yMove)>10) { // 横移动 if(ABS(yMove) > ABS(xMove)) { if(yMove > 0) { _eTouchType = TOUCH_TYPE_MOVE_BOTTOM; } else { _eTouchType = TOUCH_TYPE_MOVE_TOP; } } else { if(xMove > 0) { _eTouchType = TOUCH_TYPE_MOVE_RIGHT; } else { _eTouchType = TOUCH_TYPE_MOVE_LEFT; } } [self showTouchType]; } } break; case 2: { touch1 = [arrayTouchs objectAtIndex:0]; point1 = [touch1 locationInView:self.view]; touch2 = [arrayTouchs objectAtIndex:1]; point2 = [touch2 locationInView:self.view]; CGFloat x = point1.x - point2.x; CGFloat y = point1.y - point2.y; CGFloat fNowDistance = sqrt(x*x + y*y); if(fNowDistance > _fLastDistance) { _eTouchType = TOUCH_TYPE_ZOOM_OUT; } else if(fNowDistance < _fLastDistance) { _eTouchType = TOUCH_TYPE_ZOOM_IN; } else { break; } [self showTouchType]; } break; default: break; } } - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"touchesCancelled"); [self printTouch:event]; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. UITextField* textBox = [[UITextField alloc] initWithFrame:CGRectMake(30, 100, 200, 40)]; self._textBox = textBox; _textBox.layer.borderWidth = 2; _textBox.layer.cornerRadius = 5; _textBox.text = @"I will move"; _textBox.userInteractionEnabled = NO; _textBox.textAlignment = NSTextAlignmentCenter; [self.view addSubview:_textBox]; _bZoom = YES; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (void)dealloc { [_textBox release]; [super dealloc]; } @end
项目工程
触摸事件和手势(UITouch)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。