常用手势处理联合使用时候注意两个点,是否共存 和 正确识别哪一个。 代码参考,添加有要点注释,系统提供手势有6种:
tap 点击(可以设置单击双击等),longPress长按,Rotation 旋转,pan慢速拖动,swipe快速拖动,pinch缩放
{
UIView *View
UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGestureRecognizer:)];
[pinchGesture setDelegate:self];
UIRotationGestureRecognizer *rotateGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationGestureRecognizer:)];
[rotateGesture setDelegate:self];
[view addGestureRecognizer:[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureRecognizer:)]];
[view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureRecognizer:)]];
[view addGestureRecognizer:[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressGestureRecognizer:)]];
[view addGestureRecognizer:pinchGesture];
[view addGestureRecognizer:rotateGesture];
[view setBackgroundColor:[UIColor randomColor]];
}
-(void)pinchGestureRecognizer:(UIPinchGestureRecognizer*)gesture{
[gesture.view setTransform:CGAffineTransformScale(gesture.view.transform, gesture.scale, gesture.scale)];
gesture.scale = 1;
[gesture.view.superview bringSubviewToFront:gesture.view];
}
-(void)rotationGestureRecognizer:(UIRotationGestureRecognizer*)gesture{
[gesture.view setTransform:CGAffineTransformRotate(gesture.view.transform, gesture.rotation)];
gesture.rotation = 0;
[gesture.view.superview bringSubviewToFront:gesture.view];
}
-(void)panGestureRecognizer:(UIPanGestureRecognizer*)gesture{
CGPoint touchPoint = [gesture locationInView:gesture.view.superview];
if (gesture.state == UIGestureRecognizerStateBegan){
centerPoint = gesture.view.center;
beginTouchPoint = touchPoint;
}
[gesture.view setCenter: CGPointMake(centerPoint.x+(touchPoint.x-beginTouchPoint.x), centerPoint.y+(touchPoint.y-beginTouchPoint.y))];
[gesture.view.superview bringSubviewToFront:gesture.view];
}
-(void)tapGestureRecognizer:(UITapGestureRecognizer *)gesture{
static int i;
NSLog(@"tap gesture %d",i++);
/* 注意,如果使用了单击和双击手势,为了手势识别精确,需要使用到UIGestureRecognizer的实例方法:requireGestureRecognizerToFail:他可以指定某一个 recognizer,即便自己已经滿足條件了,也不會立刻触发,会等到该指定的 recognizer 确定失败之后才触发。代码参考如下:
[onceTapGR requireGestureRecognizerToFail:doubleTapGR];
另外Swipe(滑动,快速移动)、Pan (拖移,慢速移动)这两个手势也会存在共存干扰问题,同样可以使用这个方法来解决识别正确的哪一个手势。
*/
}
-(void)longPressGestureRecognizer:(UILongPressGestureRecognizer *)gesture{
static int j;
// 由于长按手势会在识别和抬起的时候都进入这个方法,所以这里最好判断,将犯法实现放在开始识别进来的时候进行调用就行,避免了一次长按调用两次方法内容。
if (gesture.state == UIGestureRecognizerStateBegan) {
NSLog(@"longPress gesture %d",j++);
}
}
//下面这个方法可以实现相似的手势共存(return,YES),手势pan和rotation的共存,(既同时可用)如果要只识别一个手势return NO即可。进入UIGestureRecognizer.h文件中可以看到官方的详细说明。2014-07-11
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] || [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
return NO;
}else {
return YES;
}
}