iphone练习之手势识别(双击、捏、旋转、拖动、划动、长按)

来源:互联网 发布:选创维网络电视 编辑:程序博客网 时间:2024/04/29 13:24

首先新建一个基于Sigle view Application的项目,名为GestureTest;我的项目结构如下:


往viewController.xib文件里拖动一个imageView,并使覆盖整个屏幕,改动属性为:


viewController.h文件:

#import <UIKit/UIKit.h>@interface ViewController : UIViewController{    IBOutlet UIImageView *imageView;}@property (nonatomic,retain)IBOutlet UIImageView *imageView;@end
并使xib文件里的imageView与之连接;

然后是viewController.m文件的实现部分:

@synthesize imageView;CGFloat lastScaleFactor=1;//放大、缩小CGFloat  netRotation;//旋转CGPoint netTranslation;//平衡NSArray *images;//图片数组int imageIndex=0;//数组下标- (void)viewDidLoad{    //1、创建手势实例,并连接方法handleTapGesture,点击手势    UITapGestureRecognizer *tapGesture=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleTapGesture:)];    //设置手势点击数,双击:点2下    tapGesture.numberOfTapsRequired=2;    // imageView添加手势识别    [imageView addGestureRecognizer:tapGesture];    //释放内存    [tapGesture release];        //2、手势为捏的姿势:按住option按钮配合鼠标来做这个动作在虚拟器上    UIPinchGestureRecognizer *pinchGesture=[[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(handlePinchGesture:)];    [imageView addGestureRecognizer:pinchGesture];//imageView添加手势识别    [pinchGesture release];        //3、旋转手势:按住option按钮配合鼠标来做这个动作在虚拟器上    UIRotationGestureRecognizer *rotateGesture=[[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(handleRotateGesture:)];    [imageView addGestureRecognizer:rotateGesture];    [rotateGesture release];        //4、拖手势    UIPanGestureRecognizer *panGesture=[[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePanGesture:)];   // [imageView addGestureRecognizer:panGesture];    [panGesture release];        //5、划动手势    images=[[NSArray alloc]initWithObjects:@"cell.jpg",@"heihua.jpg",@"xuanyi.jpg", nil];    //右划    UISwipeGestureRecognizer *swipeGesture=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleSwipeGesture:)];    [imageView addGestureRecognizer:swipeGesture];    [swipeGesture release];    //左划    UISwipeGestureRecognizer *swipeLeftGesture=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleSwipeGesture:)];    swipeGesture.direction=UISwipeGestureRecognizerDirectionLeft;//不设置黑夜是右    [imageView addGestureRecognizer:swipeLeftGesture];    [swipeLeftGesture release];        //6、长按手势    UILongPressGestureRecognizer *longpressGesutre=[[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(handleLongpressGesture:)];    //长按时间为1秒    longpressGesutre.minimumPressDuration=1;    //允许15秒中运动    longpressGesutre.allowableMovement=15;    //所需触摸1次    longpressGesutre.numberOfTouchesRequired=1;    [imageView addGestureRecognizer:longpressGesutre];    [longpressGesutre release];        [super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.}//双击屏幕时会调用此方法,放大和缩小图片-(IBAction)handleTapGesture:(UIGestureRecognizer*)sender{    //判断imageView的内容模式是否是UIViewContentModeScaleAspectFit,该模式是原比例,按照图片原时比例显示大小    if(sender.view.contentMode==UIViewContentModeScaleAspectFit){        //把imageView模式改成UIViewContentModeCenter,按照图片原先的大小显示中心的一部分在imageView        sender.view.contentMode=UIViewContentModeCenter;    }else{        sender.view.contentMode=UIViewContentModeScaleAspectFit;    }}//捏的手势,使图片放大和缩小,捏的动作是一个连续的动作-(IBAction)handlePinchGesture:(UIGestureRecognizer*)sender{    //得到sender捏手势的大小    CGFloat factor=[(UIPinchGestureRecognizer*)sender scale];    if(factor>1){        //图片放大        sender.view.transform=CGAffineTransformMakeScale(lastScaleFactor+(factor-1), (lastScaleFactor+(factor-1)));                                                             }else{        //缩小        sender.view.transform=CGAffineTransformMakeScale(lastScaleFactor*factor, lastScaleFactor*factor);                                                             }    //状态是否结束,如果结束保存数据    if(sender.state==UIGestureRecognizerStateEnded){        if(factor>1){            lastScaleFactor+=(factor-1);        }else{            lastScaleFactor*=factor;        }    }}//旋转手势-(IBAction)handleRotateGesture:(UIGestureRecognizer*)sender{    //浮点类型,得到sender的旋转度数    CGFloat rotation=[(UIRotationGestureRecognizer*)sender rotation];    //旋转角度CGAffineTransformMakeRotation    CGAffineTransform transform=CGAffineTransformMakeRotation(rotation+netRotation);    //改变图像角度    sender.view.transform=transform;    //状态结束,保存数据    if(sender.state==UIGestureRecognizerStateEnded){        netRotation+=rotation;    }     }//拖手势-(IBAction)handlePanGesture:(UIGestureRecognizer*)sender{    //得到拖的过程中的xy坐标    CGPoint translation=[(UIPanGestureRecognizer*)sender translationInView:imageView];    //平移图片CGAffineTransformMakeTranslation    sender.view.transform=CGAffineTransformMakeTranslation(netTranslation.x+translation.x, netTranslation.y+translation.y);    //状态结束,保存数据    if(sender.state==UIGestureRecognizerStateEnded){        netTranslation.x+=translation.x;        netTranslation.y+=translation.y;    }    }//划动手势-(IBAction)handleSwipeGesture:(UIGestureRecognizer*)sender{    //划动的方向    UISwipeGestureRecognizerDirection direction=[(UISwipeGestureRecognizer*) sender direction];    //判断是上下左右    switch (direction) {        case UISwipeGestureRecognizerDirectionUp:            NSLog(@"up");            break;        case UISwipeGestureRecognizerDirectionDown:            NSLog(@"down");            break;        case UISwipeGestureRecognizerDirectionLeft:            NSLog(@"left");            imageIndex++;//下标++            break;        case UISwipeGestureRecognizerDirectionRight:            NSLog(@"right");            imageIndex--;//下标--            break;        default:            break;    }    //得到不越界不<0的下标    imageIndex=(imageIndex<0)?([images count]-1):imageIndex%[images count];    //imageView显示图片    imageView.image=[UIImage imageNamed:[images objectAtIndex:imageIndex]];    }//长按手势-(IBAction)handleLongpressGesture:(UIGestureRecognizer*)sender{    //创建警告    UIActionSheet *actionSheet=[[UIActionSheet alloc]initWithTitle:@"Image options" delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:@"Save Image",@"Copy", nil];    //当前view显示警告    [actionSheet showInView:self.view];    [actionSheet release];}-(void)dealloc{    [images release];    [imageView release];    [super dealloc];}


嗯,试试效果吧!

本博客是我自己的练习,有好多地方没有讲太清楚,还请谅解!

转载请注明出处:http://blog.csdn.net/rhljiayou


原创粉丝点击