多触摸体系结构
1、将触摸代码放在何处
如果视图需要根据用户的触摸来对自己执行某些操作,则代码可能属于定义该视图的类。
但是,通常当正在处理的手势影响正在触摸的多个对象是时,改手势代码才真正的属于属于视图的控制器类。
2、四个手势通知方法
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEndend:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; //当发生某些事情导致手势中断时会调用这些方法。可以在此处进行任何所需的清理工作,以便重新开始一个新的手势。
3、自动手势识别
-(void)reporVerticalSwipe:(UIGestureRecognizer*)recognizer{
}
自动手势识别三部曲:
1)创建实例
UISwipeGestureRecognizer *vertical = [[[UISwipeGestureRecognizer alloc]
initWithTarget:self
action:@selector(reporVerticalSwipe:)]autorelease];
2)指定方向
vertical.direction = UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown;
3)添加到视图
[self.view addGestureRecognizer:vertical ];
4、 检测多次轻击
- (void)singleTap {
singleLabel.text = @"Single Tap Detected";
[self performSelector:@selector(eraseMe:)
withObject:singleLabel afterDelay:1.6f];
}
- (void)doubleTap {
doubleLabel.text = @"Double Tap Detected";
[self performSelector:@selector(eraseMe:)
withObject:doubleLabel afterDelay:1.6f];
}
- (void)tripleTap {
tripleLabel.text = @"Triple Tap Detected";
[self performSelector:@selector(eraseMe:)
withObject:tripleLabel afterDelay:1.6f];
}
- (void)quadrupleTap {
quadrupleLabel.text = @"Quadruple Tap Detected";
[self performSelector:@selector(eraseMe:)
withObject:quadrupleLabel afterDelay:1.6f];
}
- (void)eraseMe:(UITextField *)textField {
textField.text = @"";
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
NSUInteger tapCount = [touch tapCount];
switch (tapCount) {
case 1:
[self singleTap];
break;
case 2:
[self doubleTap];
break;
case 3:
[self tripleTap];
break;
case 4:
[self quadrupleTap];
break;
default:
break;
}
}
5、检测捏合操作
-(void)doPinch:(UIPinchGestureRecognizer *)pinch{
if(pinch ==UIGestureRecognizerStateBegin ){
}
else{
}
}
UIPinchGestureRecognizer *pinch = [[[UIPinchGestureRecognizer alloc]initWithTarget:self
action:@selector(doPinch:)]autorelease];
[self.view addGestureRecognizer:pinch];
6、检测和使用自定义手势
、h文件
· #import <CoreGraphics/CoreGraphics.h>
CGFloat distanceBetweenPoints (CGPoint first, CGPoint second);
CGFloat angleBetweenPoints(CGPoint first, CGPoint second);
CGFloat angleBetweenLines(CGPoint line1Start, CGPoint line1End, CGPoint line2Start, CGPoint lin2End);
、m文件
#include "CGPointUtils.h"
#include <math.h>
#define pi 3.14159265358979323846
#define degreesToRadian(x) (pi * x / 180.0)
#define radiansToDegrees(x) (180.0 * x / pi)
CGFloat distanceBetweenPoints (CGPoint first, CGPoint second) {
CGFloat deltaX = second.x - first.x;
CGFloat deltaY = second.y - first.y;
return sqrt(deltaX*deltaX + deltaY*deltaY );
};
CGFloat angleBetweenPoints(CGPoint first, CGPoint second) {
CGFloat height = second.y - first.y;
CGFloat width = first.x - second.x;
CGFloat rads = atan(height/width);
return radiansToDegrees(rads);
//degs = degrees(atan((top - bottom)/(right - left)))
}
CGFloat angleBetweenLines(CGPoint line1Start, CGPoint line1End, CGPoint line2Start, CGPoint line2End) {
CGFloat a = line1End.x - line1Start.x;
CGFloat b = line1End.y - line1Start.y;
CGFloat c = line2End.x - line2Start.x;
CGFloat d = line2End.y - line2Start.y;
CGFloat rads = acos(((a*c) + (b*d)) / ((sqrt(a*a + b*b)) * (sqrt(c*c + d*d))));
return radiansToDegrees(rads);
}
、h文件
#import <UIKit/UIKit.h>
#define kMinimumCheckMarkAngle 50
#define kMaximumCheckMarkAngle 135
#define kMinimumCheckMarkLength 10
@interface CheckPleaseViewController : UIViewController {
UILabel *label;
CGPoint lastPreviousPoint;
CGPoint lastCurrentPoint;
CGFloat lineLengthSoFar;
}
@property (nonatomic, retain) IBOutlet UILabel *label;
- (void)eraseLabel;
@end
、m文件
#import "CheckPleaseViewController.h"
#import "CGPointUtils.h"
@implementation CheckPleaseViewController
@synthesize label;
- (void)eraseLabel {
label.text = @"";
}
- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
self.label = nil;
[super viewDidUnload];
}
- (void)dealloc {
[label release];
[super dealloc];
}
#pragma mark -
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:self.view];
lastPreviousPoint = point;
lastCurrentPoint = point;
lineLengthSoFar = 0.0f;
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint previousPoint = [touch previousLocationInView:self.view];
CGPoint currentPoint = [touch locationInView:self.view];
CGFloat angle = angleBetweenLines(lastPreviousPoint,
lastCurrentPoint,
previousPoint,
currentPoint);
if (angle >= kMinimumCheckMarkAngle&& angle <= kMaximumCheckMarkAngle
&& lineLengthSoFar > kMinimumCheckMarkLength) {
label.text = @"Checkmark";
[self performSelector:@selector(eraseLabel)
withObject:nil afterDelay:1.6];
}
lineLengthSoFar += distanceBetweenPoints(previousPoint, currentPoint);
lastPreviousPoint = previousPoint;
lastCurrentPoint = currentPoint;
}
@end