从命名上不难了解這些类別所对应代表的手势,分別是
Tap(点一下)、Pinch(二指往內或往外拨动)、Rotation(旋转)、Swipe(滑动,快速移动)、Pan (拖移,慢速移动)以及
LongPress(长按)。這些手势別在使用上也很简单,只要在使用前定义并添加到对应的视图上即可。
UISwipeGestureRecognizer
UITapGestureRecognizer *recognizer=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)];
[infoView addGestureRecognizer:recognizer];
//--------------------------手势方法----------------------------------------------------------------------
-(void)handleTapFrom:(UITapGestureRecognizer *)recognizer
{
NSLog(@">>>tap it");
}
//--------------------------------------------------------------------------------------------------------
UIPanGestureRecognizer
UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePan:)];
[snakeImageView addGestureRecognizer:panGestureRecognizer];
//--------------------------手势方法----------------------------------------------------------------------
-(void)handlePan:(UITapGestureRecognizer *)recognizer
{
CGPoint translation = [recognizer translationInView:self.view];
recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,recognizer.view.center.y + translation.y);
[recognizer setTranslation:CGPointZero inView:self.view];
//拖动(pan手势)速度(以较快的速度拖放后view有滑行的效果)
if (recognizer.state == UIGestureRecognizerStateEnded) {
CGPoint velocity = [recognizer velocityInView:self.view];
CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y));
CGFloat slideMult = magnitude / 200;
NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult);
float slideFactor = 0.1 * slideMult; // Increase for more of a slide
CGPoint finalPoint = CGPointMake(recognizer.view.center.x + (velocity.x * slideFactor),
recognizer.view.center.y + (velocity.y * slideFactor));
finalPoint.x = MIN(MAX(finalPoint.x, 0), self.view.bounds.size.width);
finalPoint.y = MIN(MAX(finalPoint.y, 0), self.view.bounds.size.height);
[UIView animateWithDuration:slideFactor*2 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
recognizer.view.center = finalPoint;
} completion:nil];
/*
拖动(pan手势)速度代码实现解析:
-
计算速度向量的长度(估计大部分都忘了)这些知识了。
-
如果速度向量小于200,那就会得到一个小于的小数,那么滑行会很短
-
基于速度和速度因素计算一个终点
-
确保终点不会跑出父View的边界
-
使用UIView动画使view滑动到终点
*/
}
//--------------------------------------------------------------------------------------------------------
UIPinchGestureRecognizer *pinchGestureRecognizer = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(handlePinch:)];
[snakeImageView addGestureRecognizer:*pinchGestureRecognizer ];
//--------------------------手势方法----------------------------------------------------------------------
-(void)handlePinch:(UITapGestureRecognizer *)recognizer
{
recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale);
recognizer.scale = 1;
}
//--------------------------------------------------------------------------------------------------------
UIRotationGestureRecognizer
UIRotationGestureRecognizer *rotateRecognizer = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(handleRotate:)];
[snakeImageView addGestureRecognizer:rotateRecognizer];
//--------------------------手势方法----------------------------------------------------------------------
-(void)handleRotate:(UITapGestureRecognizer *)recognizer
{
recognizer.view.transform = CGAffineTransformRotate(recognizer.view.transform, recognizer.rotation);
recognizer.rotation = 0;
}
//--------------------------------------------------------------------------------------------------------
UILongPressGestureRecognizer
UILongPressGestureRecognizer *longPressGR =[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
//长按3秒后触发事件
longPressGR.minimumPressDuration = 3;
[self.view addGestureRecognizer:longPressGR];
//--------------------------手势方法----------------------------------------------------------------------
-(void)handleLongPress:(UITapGestureRecognizer *)recognizer
{
NSLog(@">>>LongPress it");
}
//--------------------------------------------------------------------------------------------------------
手势的依赖性
//如果双击确定偵測失败才會触发单击
[singleRecognizer requireGestureRecognizerToFail:doubleRecognizer];