Chinaunix首页 | 论坛 | 博客
  • 博客访问: 307033
  • 博文数量: 53
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 325
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-14 22:50
文章分类

全部博文(53)

文章存档

2014年(15)

2013年(38)

我的朋友

分类: iOS平台

2013-11-20 08:45:05

在 iPhone 或 iPad 的开发中,除了用 touchesBegan / touchesMoved / touchesEnded 这组方法来控制使用者的手指触控外,也可以用 UIGestureRecognizer 的衍生类別来进行判断。用 UIGestureRecognizer 的好处在于有现成的手势,开发者不用自己计算手指移动轨迹。UIGestureRecognizer的衍生类別有以下几种:

  • UISwipeGestureRecognizer       手指在屏幕上很快的滑动
  • UITapGestureRecognizer          轻触
  • UIPanGestureRecognizer          手指的拖动
  • UIPinchGestureRecognizer        两个指头捏或者放的操作
  • UIRotationGestureRecognizer    手指反向操作
  • UILongPressGestureRecognizer 在一点上长按



从命名上不难了解這些类別所对应代表的手势,分別是 Tap(点一下)、Pinch(二指往內或往外拨动)、Rotation(旋转)、Swipe(滑动,快速移动)、Pan (拖移,慢速移动)以及 LongPress(长按)。這些手势別在使用上也很简单,只要在使用前定义并添加到对应的视图上即可。

UISwipeGestureRecognizer

UISwipeGestureRecognizer* recognizer; 
// handleSwipeFrom 是偵測到手势,所要呼叫的方法  
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom)]; 
// 不同的 Recognizer 有不同的实体变数 
// 例如 SwipeGesture 可以指定方向 
//右:UISwipeGestureRecognizerDirectionRight
//上:UISwipeGestureRecognizerDirectionUp
//下:UISwipeGestureRecognizerDirectionDown
//左:UISwipeGestureRecognizerDirectionLeft 
recognizer.direction = UISwipeGestureRecognizerDirectionUp;
[self.view addGestureRecognizer:recognizer];


//--------------------------手势方法----------------------------------------------------------------------
- (void)handleSwipeFrom:(UISwipeGestureRecognizer*)recognizer 
{    
// 触发手勢事件后,在这里作些事情     
// 底下是刪除手势的方法    
[self.view removeGestureRecognizer:recognizer]; 
}
//--------------------------------------------------------------------------------------------------------

UITapGestureRecognizer 

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手势)速度
代码实现解析:
  1. 计算速度向量的长度(估计大部分都忘了)这些知识了。
  2. 如果速度向量小于200,那就会得到一个小于的小数,那么滑行会很短
  3. 基于速度和速度因素计算一个终点
  4. 确保终点不会跑出父View的边界
  5. 使用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];


 
阅读(936) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~