开发ios应用时我们经常用到多手势来处理事情,如给scrollView增加点击事件,scrollView不能响应view的touch事件,但有时候却要用到多手势事件,那么我们可以给这个scrollView增加自己的手指事件。给imageView增加点击、放大、旋转等都可以通过多手势来完成。
下面就介绍下各种的手势的使用方法,及注意事项。
- (void)viewDidLoad {
[super viewDidLoad];
//为了能响应多手势事件,imageView的userInteractionEnabled属性要设为YES.
self.imageView.userInteractionEnabled=YES; //1、手指点击事件
//单指单击
UITapGestureRecognizer *singleFingerOne = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(fingerIncident:)];
//手指数
singleFingerOne.numberOfTouchesRequired = ;
//点击次数
singleFingerOne.numberOfTapsRequired = ;
//设置代理方法
singleFingerOne.delegate= self;
//增加事件者响应者,
[self.imageView addGestureRecognizer:singleFingerOne]; //单指双击
UITapGestureRecognizer *singleFingerTwo = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(fingerIncident:)];
singleFingerTwo.numberOfTouchesRequired = ;
singleFingerTwo.numberOfTapsRequired = ;
singleFingerTwo.delegate= self;
[self.imageView addGestureRecognizer:singleFingerTwo]; //双指单击
UITapGestureRecognizer *doubleFingerOne = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(fingerIncident:)];
doubleFingerOne.numberOfTouchesRequired = ;
doubleFingerOne.numberOfTapsRequired = ;
doubleFingerOne.delegate= self;
[self.imageView addGestureRecognizer:doubleFingerOne]; //双指双击
UITapGestureRecognizer *doubleFingerTwo = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(fingerIncident:)];
doubleFingerTwo.numberOfTouchesRequired = ;
doubleFingerTwo.numberOfTapsRequired = ;
doubleFingerTwo.delegate= self;
[self.imageView addGestureRecognizer:doubleFingerTwo]; //如果不加下面的话,当单指双击时,会先调用单指单击中的处理,再调用单指双击中的处理
[singleFingerOne requireGestureRecognizerToFail:singleFingerTwo];
//同理双指也是如此
[doubleFingerOne requireGestureRecognizerToFail:doubleFingerTwo]; //2、手势为捏的姿势:按住option按钮配合鼠标来做这个动作在虚拟器上
UIPinchGestureRecognizer *pinchGesture=[[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(handlePinchGesture:)];
[self.imageView addGestureRecognizer:pinchGesture];//imageView添加手势识别
[pinchGesture release]; //3、旋转手势:按住option按钮配合鼠标来做这个动作在虚拟器上
UIRotationGestureRecognizer *rotateGesture=[[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(handleRotateGesture:)];
[self.imageView addGestureRecognizer:rotateGesture];
[rotateGesture release]; //4、拖手势
UIPanGestureRecognizer *panGesture=[[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePanGesture:)];
[self.imageView addGestureRecognizer:panGesture];
[panGesture release]; //当实现上面拖手势(UIPanGestureRecognizer)后将不能响应下面的左右划(UISwipeGestureRecognizer)事件,事件会被拖手势栏截,所以左右划和拖手势只能选其一
//右划
UISwipeGestureRecognizer *swipeGesture=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleSwipeGesture:)];
[self.imageView addGestureRecognizer:swipeGesture];
[swipeGesture release];
//左划
UISwipeGestureRecognizer *swipeLeftGesture=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleSwipeGesture:)];
swipeGesture.direction=UISwipeGestureRecognizerDirectionLeft;//不设置黑夜是右
[self.imageView addGestureRecognizer:swipeLeftGesture];
[swipeLeftGesture release]; UILongPressGestureRecognizer *longpressGesutre=[[UILongPressGestureRecognizer alloc]initWithTarget:self
action:@selector(handleLongpressGesture:)];
//长按时间为1秒
longpressGesutre.minimumPressDuration=0.5;
//允许15秒中运动
longpressGesutre.allowableMovement=;
//所需触摸1次
longpressGesutre.numberOfTouchesRequired=;
[self.imageView addGestureRecognizer:longpressGesutre];
[longpressGesutre release];
} //手指点击事件
- (void)fingerIncident:(UITapGestureRecognizer *)sender
{
if (sender.numberOfTouchesRequired==) {
//单指点击事件
if(sender.numberOfTapsRequired == ) {
//单指单击
NSLog(@"单指单击");
[sender.view.layer removeAllAnimations];
}
else if(sender.numberOfTapsRequired == ){
//单指双击
NSLog(@"单指双击");
}
}
else if (sender.numberOfTouchesRequired==) {
//双指点击事件
if(sender.numberOfTapsRequired == ) {
//双指单击
NSLog(@"双指单击");
}
else if(sender.numberOfTapsRequired == ){
//双指双击
NSLog(@"双指双击");
}
}
} //手指左右滑动事件
-(void)handleSwipeGesture:(UISwipeGestureRecognizer *)sender{
if (sender.direction==UISwipeGestureRecognizerDirectionLeft) {
NSLog(@"左滑");
}
else{
NSLog(@"右滑");
}
} //手指捏事件
-(void)handlePinchGesture:(UIPinchGestureRecognizer *)sender{
NSLog(@"捏"); if([sender state] == UIGestureRecognizerStateEnded) {
lastScale = 1.0;
return;
} CGFloat scale = 1.0 - (lastScale - [(UIPinchGestureRecognizer*)sender scale]); CGAffineTransform newTransform = CGAffineTransformScale(sender.view.transform, scale, scale); [sender.view setTransform:newTransform];
lastScale = [sender scale];
} //手指旋转事件
-(void)handleRotateGesture:(UIRotationGestureRecognizer *)sender{
NSLog(@"旋转"); NSLog(@"sender.scale=%f",sender.rotation);
NSLog(@"sender.velocity=%f",sender.velocity); sender.view.transform=CGAffineTransformRotate(sender.view.transform, sender.rotation);
sender.rotation=;
} //手指拖事件
-(void)handlePanGesture:(UIPanGestureRecognizer *)sender{
NSLog(@"拖");
NSLog(@"sender=%@",sender);
CGPoint translation=[(UIPanGestureRecognizer*)sender translationInView:self.view]; //开始
if (sender.state==UIGestureRecognizerStateBegan) {
x=sender.view.center.x;
y=sender.view.center.y;
}
//进行中
if (sender.state==UIGestureRecognizerStateChanged) {
sender.view.center=CGPointMake(x+translation.x, y+translation.y);
}
//结束
if (sender.state==UIGestureRecognizerStateEnded) {
sender.view.center=CGPointMake(x+translation.x, y+translation.y);
}
} //手指长按事件
-(void)handleLongpressGesture:(UILongPressGestureRecognizer *)sender{
NSLog(@"长按");
if (sender.state==UIGestureRecognizerStateBegan) {
CABasicAnimation* rotationAnimation_ = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
//角度转弧度
rotationAnimation_.fromValue = [NSNumber numberWithFloat:(-0.02)];
rotationAnimation_.toValue = [NSNumber numberWithFloat:(0.02)];
//动画时间
rotationAnimation_.duration = 0.1f;
//动画次数
rotationAnimation_.repeatCount=FLT_MAX;
//回退动画
rotationAnimation_.autoreverses = YES;
//动画开始结束的快慢,设置为加速
rotationAnimation_.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
[[sender.view layer] addAnimation:rotationAnimation_ forKey:@"revItUpAnimation"];
}
}

最新文章

  1. 卡特兰数(Catalan)
  2. 树状数组+STL FZU 2029 买票问题
  3. log4j2自定义输出线程环境信息
  4. eclipse 打开是报错"reload maven project has encountered a problem"
  5. JS中style属性
  6. Sql server之路 (六)上传服务器图片
  7. hdu 3466 排序01背包
  8. discuz二次开发之后导航无法高亮 $mnid == $nav[navid]解决办法(转)
  9. WPFX名称空间
  10. 用数据库管理SERV-U的用户时,如何修改密码及原理
  11. PHP面向对象的基本写法(区别于java)
  12. 使用 Nginx 来反向代理多个 NoderCMS
  13. Activity与DialogFragment交互的方法
  14. 由PHP实现单向链表引发的对象赋值,对象传参,链表操作引发的一系列问题
  15. DFA算法实现关键字查找(正则原理入门)
  16. Android Vector曲折的兼容之路
  17. 设置MyEclipse字体大小
  18. django(五):cookie和session
  19. 关于Vue中:key="index"的console警告
  20. escape(), encodeURL(), encodeURIComponent()

热门文章

  1. [译]如何使用 Docker 组件开发 Django 项目?
  2. HDU 4006 The kth great number(multiset(或者)优先队列)
  3. hadoop配置错误
  4. POJ 2109
  5. Python之socketserver源码分析
  6. hdu 4345 Permutation 记忆化搜索
  7. [转载]Jmeter那点事·ForEach和If控制器
  8. linux下如何查看主机的外网ip地址
  9. lintcode:等价二叉树
  10. Junit单元测试学习笔记一