首页 > 代码库 > IOS开发UI篇—手势识别器(拖拽+旋转+缩放)

IOS开发UI篇—手势识别器(拖拽+旋转+缩放)

IOS开发UI篇—手势识别器(拖拽+旋转+缩放)

一、拖拽

示例代码:

 1 // 2 //  YYViewController.m 3 //  06-拖拽事件 4 // 5 //  Created by apple on 14-6-19. 6 //  Copyright (c) 2014年 itcase. All rights reserved. 7 // 8  9 #import "YYViewController.h"10 11 @interface YYViewController ()12 @property (strong, nonatomic) IBOutlet UIView *iconView;13 14 @end15 16 @implementation YYViewController17 18 - (void)viewDidLoad19 {20     [super viewDidLoad];21 22     //拖拽事件23     UIPanGestureRecognizer *pan=[[UIPanGestureRecognizer alloc]init];24     [self.iconView addGestureRecognizer:pan];25     [pan addTarget:self action:@selector(panView:)];26 }27 28 -(void)panView:(UIPanGestureRecognizer*)pan29 {30     //以控制器上的view的左上角为坐标原点31     CGPoint point=[pan locationInView:pan.view];32     NSLog(@"拖拽事件");33     NSLog(@"获取到的触摸点的位置为:%@",NSStringFromCGPoint(point));34     35     CGPoint point1=[pan translationInView:pan.view];36     NSLog(@"拖拽事件1");37     NSLog(@"获取到的触摸点的位置为:%@",NSStringFromCGPoint(point1));38     39     //手指拖动,让自定义的view也跟着手指移动40     CGPoint temp=self.iconView.center;41     temp.x+=point1.x;42     temp.y+=point1.y;43     self.iconView.center=temp;44     45     //清空46     [pan setTranslation:CGPointZero inView:pan.view];47 }48 @end

 注意点:1.注意拖拽事件的位移叠加。

注意数学递增性,需要在每次调用完之后进行清空处理。

2.注意获取的点是以手指按下的点为原点的。CGPoint point1=[pan translationInView:pan.view];

    //以控制器上的view的左上角为坐标原点 CGPoint point=[pan locationInView:pan.view];

 

二、旋转

示例代码:

 1 // 2 //  YYViewController.m 3 //  07-旋转 4 // 5 //  Created by apple on 14-6-19. 6 //  Copyright (c) 2014年 itcase. All rights reserved. 7 // 8  9 #import "YYViewController.h"10 11 @interface YYViewController ()12 @property (weak, nonatomic) IBOutlet UIImageView *iconView;13 14 @end15 16 @implementation YYViewController17 18 - (void)viewDidLoad19 {20     [super viewDidLoad];21     22     //旋转23     //创建手势识别器(旋转)24     UIRotationGestureRecognizer *gesture=[[UIRotationGestureRecognizer alloc]init];25     //添加手势识别器26     [self.iconView addGestureRecognizer:gesture];27     //监听28     [gesture addTarget:self action:@selector(gestureView:)];29 }30 31 -(void)gestureView:(UIRotationGestureRecognizer*)gesture32 {33     34     //旋转的弧度:gesture.rotation35     NSLog(@"旋转事件,旋转的弧度为:%1f",gesture.rotation);36     37     //让图片跟随手指一起旋转38     //每次从最初的位置开始39 //    self.iconView.transform=CGAffineTransformMakeRotation(gesture.rotation);40     41     //在传入的transform的基础上旋转42     //在之前的基础上,让图片跟随一起旋转(去掉自动布局)43     //注意问题:以风火轮的速度旋转44     self.iconView.transform=CGAffineTransformRotate(self.iconView.transform, gesture.rotation);45     //将旋转的弧度清零46     //(注意不是将图片旋转的弧度清零,而是将当前手指旋转的弧度清零)47     gesture.rotation=0;48 }49 @end

 注意点:

1.imageview默认为不可交互的,且不支持多点触控,需要在storyboard中勾选这两项。

2.旋转的度数叠加

3.旋转

将旋转弧度清零之后,每次调用又从零开始。

 

三、缩放

 1 // 2 //  YYViewController.m 3 //  07-旋转 4 // 5 //  Created by apple on 14-6-19. 6 //  Copyright (c) 2014年 itcase. All rights reserved. 7 // 8  9 #import "YYViewController.h"10 11 @interface YYViewController ()<UIGestureRecognizerDelegate>12 @property (weak, nonatomic) IBOutlet UIImageView *iconView;13 14 @end15 16 @implementation YYViewController17 18 - (void)viewDidLoad19 {20     [super viewDidLoad];21     [self pinchTest];22     [self gestureTest];23 }24 25 -(void)pinchTest26 {27         //缩放28     UIPinchGestureRecognizer *pinch=[[UIPinchGestureRecognizer alloc]init];29     [self.iconView addGestureRecognizer:pinch];30     [pinch addTarget:self action:@selector(pinchView:)];31     32     //设置代理33     pinch.delegate=self;34 }35 36 -(void)pinchView:( UIPinchGestureRecognizer* )pinch37 {38     //缩放的比例    pinch.scale;39     NSLog(@"缩放:%f",pinch.scale);40     //对图片进行缩放41 //    self.iconView.transform=CGAffineTransformMakeScale(pinch.scale,pinch.scale);42     //在已有的基础上对图片进行缩放43     self.iconView.transform=CGAffineTransformScale(self.iconView.transform, pinch.scale, pinch.scale);44     //清零45     pinch.scale=1.0;46 }47 -(void)gestureTest48 {49     //旋转50     //创建手势识别器(旋转)51     UIRotationGestureRecognizer *gesture=[[UIRotationGestureRecognizer alloc]init];52     //添加手势识别器53     [self.iconView addGestureRecognizer:gesture];54     //监听55     [gesture addTarget:self action:@selector(gestureView:)];56     57     //设置代理58     gesture.delegate=self;59 }60 -(void)gestureView:(UIRotationGestureRecognizer*)gesture61 {62     63     //旋转的弧度:gesture.rotation64     NSLog(@"旋转事件,旋转的弧度为:%1f",gesture.rotation);65     66     //让图片跟随手指一起旋转67     //每次从最初的位置开始68 //    self.iconView.transform=CGAffineTransformMakeRotation(gesture.rotation);69     70     //在传入的transform的基础上旋转71     //在之前的基础上,让图片跟随一起旋转(去掉自动布局)72     //注意问题:以风火轮的速度旋转73     self.iconView.transform=CGAffineTransformRotate(self.iconView.transform, gesture.rotation);74     //将旋转的弧度清零75     //(注意不是将图片旋转的弧度清零,而是将当前手指旋转的弧度清零)76     gesture.rotation=0;77 }78 79 //实现代理方法80 -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer81 {82     //默认为NO,这里设置为YES83     return YES;84 }85 @end

 提示:设置手势识别器的代理,使用代理让代理方法返回一个YES的布尔值,能够响应多个手势。

 说明:手指按下的时候为1.如果不进行清零,那么缩放也是叠加的(1.0*0.9*0.8)。