如何使用iOSios中捏合手势的使用UIGestureRecognizer

&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!IOS多点触控与手势识别
IOS多点触控与手势识别(已完结)
课程描述:IOS多点触控与手势识别
分享给朋友
已有13975位同学与你并肩作战
更多学习交流,请加:
分享到微信
用微信“扫一扫”下方的二维码,即可吧视频分享给您的好友或朋友圈。
共页,第页
这是默认的课后作业,赶快把老师课堂讲的代码做一遍提交上来吧
RecognitionDemo
RotationGesture
SwipeGestureDemo
PanGesture
LongPressGesture
UIViewTest
CustomGesture
登陆后,可以在线编写代码,实时查看运行结果边学边练,快速提升能力!
麦子学院首席讲师,国内知名的软件开发架构师。擅长领域包括移动互联网开发,嵌入式以及大数据,人工智能...... 丰富的海外工作经验及管理经验。
公司名称:赐云网络
年薪:32.5万
规模:15-50人
最低学历:本科
阶段:初创型(未融...
职位诱惑:
公司名称:和创科技(红圈营销)
年薪:45.5万
规模:2000人以上
最低学历:本科
阶段: 上市公司
职位诱惑:
公司名称:和创科技(红圈营销)
年薪:45.5万
规模:2000人以上
最低学历:本科
阶段: 上市公司
职位诱惑:
APP可离线下载该课程
扫描二维码下载APP
抱歉,该课程视频仅限该直通班学员观看哦~
立即报名,您可享有
免费观看所有课程视频
智能在线学习系统
名师小班指导
全国就业服务
现在开通试学班,只要288元
回复发布成功!
积累积分可兑换麦子商城礼品,敬请期待!
分享邀请链接,好友注册后报名立减300学费!
每报名一位好友,立返300现金红包!邀请规则 &&
我的邀请链接
分享邀请链接到:
还没有账号?
其他方式登录
手机短信验证码已发送,请查收!
发送验证码
已经有账号?
如果你想在名师的指导下迅速成为一名iOS应用开发,那就现在报名吧!报名后你将会享受以下服务:
名师一对一指导
在线知识要点自测
真实项目制作
保就业服务iOS开发 - 手势识别(UIGestureRecognizer)
UIGestureRecognizer
为了完成手势识别,必须借助于手势识别器&-UIGestureRecognizer
利用UIGestureRecognizer,能轻松识别用户在某个view上面做的一些常见手势
UIGestureRecognizer是一个抽象类,定义了所有手势的基本行为,使用它的子类才能处理具体的手势
UITapGestureRecognizer
UIPinchGestureRecognizer
//(捏合,用于缩放)
UIPanGestureRecognizer
UISwipeGestureRecognizer
UIRotationGestureRecognizer
UILongPressGestureRecognizer //(长按)
敲击 UITapGestureRecognizer
每一个手势识别器的用法都差不多,比如UITapGestureRecognizer的使用步骤如下
创建手势识别器对象
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
设置手势识别器对象的具体属性
// 连续敲击2次
tap.numberOfTapsRequired = 2;
// 需要2根手指一起敲击
tap.numberOfTouchesRequired = 2;
添加手势识别器到对应的view上
[self.iconView addGestureRecognizer:tap];
监听手势的触发
[tap addTarget:self action:@selector(tapIconView:)];
@interface GRViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *iconV
@implementation GRViewController
- (void)viewDidLoad
[super viewDidLoad];
[self testTap2];
- (void)testTap2
UIGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapView)];
tap.delegate =
[self.iconView addGestureRecognizer:tap];
#pragma mark - 代理方法
当点击view的时候,会先调用这个方法
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
CGPoint pos = [touch locationInView:touch.view];
if (pos.x &= self.iconView.frame.size.width * 0.5) {
return YES;
return NO;
- (void)testTap
// 1.创建手势识别器对象
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
// 连续敲击2次,手势才能识别成功
tap.numberOfTapsRequired = 2;
tap.numberOfTouchesRequired = 2;
// 2.添加手势识别器对象到对应的view
[self.iconView addGestureRecognizer:tap];
// 3.添加监听方法(识别到了对应的手势,就会调用监听方法)
[tap addTarget:self action:@selector(tapView)];
- (void)tapView
NSLog(@&-----我敲击了屏幕!!&);
长按和轻扫实例
@interface GRViewController ()
@property (weak, nonatomic) IBOutlet UIView *redV
@implementation GRViewController
- (void)viewDidLoad
[super viewDidLoad];
UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeView)];
swipe.direction = UISwipeGestureRecognizerDirectionUp;
[self.redView addGestureRecognizer:swipe];
- (void)swipeView
NSLog(@&swipeView&);
- (void)testLongPress
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] init];
[longPress addTarget:self action:@selector(longPressView)];
// 至少长按2秒
longPress.minimumPressDuration = 2;
// 在触发手势之前,50px范围内长按有效
longPress.allowableMovement = 50;
[self.redView addGestureRecognizer:longPress];
- (void)longPressView
NSLog(@&长按了红色的view&);
缩放和旋转实例
@interface GRViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *iconV
@implementation GRViewController
- (void)viewDidLoad
[super viewDidLoad];
[self testPinchAndRotate];
#pragma mark - 手势识别器的代理方法
是否允许多个手势识别器同时有效
Simultaneously : 同时地
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
return YES;
#pragma mark - 缩放 + 旋转
- (void)testPinchAndRotate
[self testPinch];
[self testRotate];
#pragma mark - 缩放手势(捏合手势)
- (void)testPinch
UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchView:)];
pinch.delegate =
[self.iconView addGestureRecognizer:pinch];
- (void)pinchView:(UIPinchGestureRecognizer *)pinch
pinch.view.transform = CGAffineTransformScale(pinch.view.transform, pinch.scale, pinch.scale);
pinch.scale = 1; // 这个真的很重要!!!!!
#pragma mark - 旋转手势
- (void)testRotate
UIRotationGestureRecognizer *recognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotateView:)];
recognizer.delegate =
[self.iconView addGestureRecognizer:recognizer];
- (void)rotateView:(UIRotationGestureRecognizer *)recognizer
recognizer.view.transform = CGAffineTransformRotate(recognizer.view.transform, recognizer.rotation);
recognizer.rotation = 0; // 这个很重要!!!!!
@interface GRViewController ()
@property (weak, nonatomic) IBOutlet UIView *purpleV
@implementation GRViewController
- (void)viewDidLoad
[super viewDidLoad];
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panView:)];
[self.purpleView addGestureRecognizer:pan];
- (void)panView:(UIPanGestureRecognizer *)pan
switch (pan.state) {
case UIGestureRecognizerStateBegan: // 开始触发手势
case UIGestureRecognizerStateEnded: // 手势结束
// 1.在view上面挪动的距离
CGPoint translation = [pan translationInView:pan.view];
CGPoint center = pan.view.
center.x += translation.x;
center.y += translation.y;
pan.view.center =
// 2.清空移动的距离
[pan setTranslation:CGPointZero inView:pan.view];
手势识别的状态
typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
// 没有触摸事件发生,所有手势识别的默认状态
UIGestureRecognizerStatePossible,
// 一个手势已经开始但尚未改变或者完成时
UIGestureRecognizerStateBegan,
// 手势状态改变
UIGestureRecognizerStateChanged,
// 手势完成
UIGestureRecognizerStateEnded,
// 手势取消,恢复至Possible状态
UIGestureRecognizerStateCancelled,
// 手势失败,恢复至Possible状态
UIGestureRecognizerStateFailed,
// 识别到手势识别
UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEndediOS开发中的几个手势操作实例分享
作者:TommyYaphetS
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了iOS开发中的几个手势操作实例分享,编写代码为传统的Objective-C,需要的朋友可以参考下
手势操作---识别单击还是双击
在视图上同时识别单击手势和双击手势的问题在于,当检测到一个单击操作时,无法确定是确实是一个单击操作或者只是双击操作中的第一次点击。解决这个问题的方法就是:在检测到单击时,需要等一段时间等待第二次点击,如果没有第二次点击,则为单击操作;如果有第二次点击,则为双击操作。
检测手势有两种方法,一种是定制子视图,重写视图从UIResponder类中继承来的事件处理方法,即touchesBegan:withEvent:等一系列方法来检测手势;另一个方法是使用手势识别器,即UIGestureRecognizer的各种具体子类。
一.重写事件处理方法
- (id)init {&
&&& if ((self = [super init])) {&
&&&&&&& self.userInteractionEnabled = YES;&
&&&&&&& self.multipleTouchEnabled = YES;&
&&&&&&& // ...&
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event&
&&& [NSObject cancelPreviousPerformRequestsWithTarget:self];&
&&& UITouch *touch = [touches anyObject];&
&&& CGPoint touchPoint = [touch locationInView:self];&
&&& if (touch.tapCount == 1) {&
&&&&&&& [self performSelector:@selector(handleSingleTap:) withObject:[NSValue valueWithCGPoint:touchPoint] afterDelay:0.3];&
&&& }else if(touch.tapCount == 2)&
&&&&&&& [self handleDoubleTap:[NSValue valueWithCGPoint:touchPoint]];&
-(void)handleSingleTap:(NSValue*)pointValue&
&&& CGPoint touchPoint = [pointValue CGPointValue];&
&&& //...&
-(void)handleDoubleTap:(NSValue*)pointValue&
&&& CGPoint touchPoint = [pointValue CGPointValue];&
&&& //...&
首先确认定制视图的userInteractionEnabled和multipleTouchEnabled属性都为YES.
在touchesEnded:withEvent:方法中,如果是第一次触摸结束,则cancelPreviousPerformRequestsWithTarget:方法不会起作用,因为self未调度任何方法,此时tapCount为1,使用performSelector:withObject:afterDelay:调用单击事件处理方法,在0.3s钟后执行。 代码如下:
[self performSelector:@selector(handleSingleTap:) withObject:[NSValue valueWithCGPoint:touchPoint] afterDelay:0.3];
如果这是一个单击操作,则后面0.3钟内不会再有触摸事件,则handleSingleTap:方法执行,这样识别出了单击操作。
如果这是一个双击操作,则第二次点击在0.3s内触发,在第二次触摸操作的touchesEnded:withEvent:方法中,cancelPreviousPerformRequestsWithTarget:首先会取消之前对handleSingleTap:方法的调度,使之不会执行,然后在调用handleDoubleTap:方法处理双击操作。
二.使用Gesture Recognizer
使用Gesture Recognizer识别就会简单许多,只需添加两个手势识别器,分别检测单击和双击事件,设置必要的属性即可。
- (id)init {&
&&& if ((self = [super init])) {&
&&& self.userInteractionEnabled = YES;&
&&&&&&& UITapGestureRecognizer *singleTapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleSingleTap:)];&
&&&&&&& singleTapGesture.numberOfTapsRequired = 1;&
&&&&&&& singleTapGesture.numberOfTouchesRequired& = 1;&
&&&&&&& [self addGestureRecognizer:singleTapGesture];&
&&&&&&& UITapGestureRecognizer *doubleTapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleDoubleTap:)];&
&&&&&&& doubleTapGesture.numberOfTapsRequired = 2;&
&&&&&&& doubleTapGesture.numberOfTouchesRequired = 1;&
&&&&&&& [self addGestureRecognizer:doubleTapGesture];&
&&&&&&& [singleTapGesture requireGestureRecognizerToFail:doubleTapGesture];&
-(void)handleSingleTap:(UIGestureRecognizer *)sender{&
&&& CGPoint touchPoint = [sender locationInView:self];&
&&& //...&
-(void)handleDoubleTap:(UIGestureRecognizer *)sender{&
&&& CGPoint touchPoint = [sender locationInView:self];&
&&& //...&
唯一需要注意的是 代码如下:
[singleTapGesture requireGestureRecognizerToFail:doubleTapGesture];&
这句话的意思时,只有当doubleTapGesture识别失败的时候(即识别出这不是双击操作),singleTapGesture才能开始识别,同我们一开始讲的是同一个问题。
UIGestureRecognizer小应用
1、轻拍手势:双指、单击,修改imageView的frame为(0,0,320,200)
2、长按手指:单指,修改imageView的alpha=0.5
3、实现平移、旋转、捏合
4、轻扫:竖向轻扫实现图:像随机切换显示;横向轻扫实现:图像消失,随机修改imageview的背景颜色
5、imageview每次只能添加一种手势识别器。
#define _originalRect CGRectMake(10, 50, 300, 450)&
#define _originalImageName& @"h4.jpeg"&
#import "HMTRootViewController.h"&
@interface HMTRootViewController (){&
&&& UITapGestureRecognizer&&&&&& * _tapG&
&&& UILongPressGestureRecognizer * _longG&
&&& UIPanGestureRecognizer&&&&&& * _panG&
&&& UIRotationGestureRecognizer& * _rotateG&
&&& UIPinchGestureRecognizer&&&& * _pinchG&
&&& UISwipeGestureRecognizer&&&& * _verticalSwipeG&
&&& UISwipeGestureRecognizer&&&& * _horizontanlSwipeG&
&&& BOOL isTopDownOfRightL&&& // 垂直滑动是YES,水平滑动是NO&
@property (nonatomic,retain) UIButton *&
@property (nonatomic,retain) UIImageView * imageV&
@implementation HMTRootViewController&
- (void)dealloc{&
&&& RELEASE_SAFELY(_imageView);&
&&& RELEASE_SAFELY(_button);&
&&& [super dealloc];&
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil&
&&& self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];&
&&& if (self) {&
&&&&&&& // Custom initialization&
&&&&&&& isTopDownOfRightLeft = YES;&
- (void)viewDidLoad&
&&& [super viewDidLoad];&
&&& // Do any additional setup after loading the view.&
&&& [self createButtonView];&
&&& [self createImageView];&
#pragma mark - 设置图像&
- (void)createImageView{&
&&& self.imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:_originalImageName]];&
&&& _imageView.frame = CGRectMake(10, 50, 300, 450);&
&&& _imageView.userInteractionEnabled = YES;&
&&& [self.view addSubview:_imageView];&
&&& [_imageView release];&
#pragma mark - 设置手势&
#pragma mark& 点击手势&
- (void)createTapGestureRecognizer{&
&&& _tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(TapGestureRecognizer:)];&
&&& _tapGesture.numberOfTapsRequired = 1;&
&&& _tapGesture.numberOfTouchesRequired = 2;&
&&& [self.imageView addGestureRecognizer:_tapGesture];&
&&& [_tapGesture release];&
- (void)TapGestureRecognizer:(UITapGestureRecognizer *)tapGesture{&
&&& self.imageView.frame = CGRectMake(0, 0, 320, 200);&
&&& NSLog(@"%@",NSStringFromCGRect(self.imageView.frame));&
#pragma mark& 长按手势&
- (void)createLongGestureRecognizer{&
&&& _longGesture = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longGestureRecognizer:)];&
&&& _longGesture.numberOfTouchesRequired = 1;&
&&& _longGesture.minimumPressDuration = 1.0;&
&&& [self.imageView addGestureRecognizer:_longGesture];&
&&& [_longGesture release];&
- (void)longGestureRecognizer:(UILongPressGestureRecognizer *)longGesture{&
&&& self.imageView.alpha = 0.5;&
&&& NSLog(@"%s",__FUNCTION__);&
#pragma mark 平移拖拽手势&
- (void)createPanGestureRecognizer{&
&&& _panGesture = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGestureRecognizer:)];&
&&& [self.imageView addGestureRecognizer:_panGesture];&
&&& [_panGesture release];&
- (void)panGestureRecognizer:(UIPanGestureRecognizer *)panGesture{&
&&& NSLog(@"%s",__FUNCTION__);&
&&& CGPoint txty = [panGesture translationInView:self.view];&
&&& self.imageView.transform = CGAffineTransformTranslate(self.imageView.transform, txty.x, txty.y);&
&&& [panGesture setTranslation:CGPointMake(0, 0) inView:self.view];&
#pragma mark 旋转手势&
- (void)createRotationGestureRecognizer{&
&&& _rotateGesture = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotationGestureRecognizer:)];&
&&& [self.imageView addGestureRecognizer:_rotateGesture];&
&&& [_rotateGesture release];&
- (void)rotationGestureRecognizer:(UIRotationGestureRecognizer *)rotateGesture{&
&&& NSLog(@"%s",__FUNCTION__);&
&&& self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, rotateGesture.rotation);&
&&& rotateGesture.rotation = 0;&
#pragma mark 捏合缩放手势&
- (void)createPinchGestureRecognizer{&
&&& _pinchGesture = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinchGestureRecognizer:)];&
&&& [self.imageView addGestureRecognizer:_pinchGesture];&
&&& [_pinchGesture release];&
- (void)pinchGestureRecognizer:(UIPinchGestureRecognizer *)pinchGesture{&
&&& NSLog(@"%s",__FUNCTION__);&
&&& self.imageView.transform = CGAffineTransformScale(self.imageView.transform, pinchGesture.scale, pinchGesture.scale);&
&&& pinchGesture.scale = 1;&
#pragma mark - 轻扫手势&
#pragma mark 上下 竖 垂直轻扫&
- (void)createVerticalSwipeGestureRecognizer{&
&&& _verticalSwipeGesture = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeGestureRecognizer:)];&
&&& _verticalSwipeGesture.direction = UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionD&
&&& [self.imageView addGestureRecognizer:_verticalSwipeGesture];&
&&& [_verticalSwipeGesture release];&
#pragma mark 水平 左右轻扫&
- (void)createHorizontanlSwipeGesture{&
&&& _horizontanlSwipeGesture = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeGestureRecognizer:)];&
&&& _horizontanlSwipeGesture.direction = UISwipeGestureRecognizerDirectionLeft |UISwipeGestureRecognizerDirectionR&
&&& [self.imageView addGestureRecognizer:_horizontanlSwipeGesture];&
- (void)swipeGestureRecognizer:(UISwipeGestureRecognizer *)swipeGesture{&
&&& NSLog(@"%s",__FUNCTION__);&
&&& if (swipeGesture.direction == (UISwipeGestureRecognizerDirectionUp|UISwipeGestureRecognizerDirectionDown)) {&
&&&&&&& self.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"h%i.jpeg",arc4random()%7+1]];&
&&&&&&& ;&
&&& }else if (swipeGesture.direction == (UISwipeGestureRecognizerDirectionLeft|UISwipeGestureRecognizerDirectionRight)){&
&&&&&&& self.imageView.image =&
&&&&&&& self.imageView.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1.0];&
#pragma mark - 设置按钮&
- (void)createButtonView{&
&&& NSArray * buttonArray = @[@"轻点",@"长按",@"平移",@"旋转",@"捏合",@"轻扫"];&
&&& for (int i = 0; i & [buttonArray count]; i++) {&
&&&&&&& self.button = [UIButton buttonWithType:UIButtonTypeSystem];&
&&&&&&& _button.frame = CGRectMake(10+50*i, 500, 50, 48);&
&&&&&&& [_button setTitle:[buttonArray objectAtIndex:i] forState:UIControlStateNormal];&
&&&&&&& [_button addTarget:self action:@selector(onClikButton:) forControlEvents:UIControlEventTouchUpInside];&
&&&&&&& _button.tag =&
&&&&&&& [self.view addSubview:_button];&
- (void)onClikButton:(UIButton *)button{&
&&& [self resetImageView];&
&&& switch (button.tag) {&
&&&&&&& case 0:&
&&&&&&&&&&& [self createTapGestureRecognizer];&
&&&&&&&&&&&&
&&&&&&& case 1:&
&&&&&&&&&&& [self createLongGestureRecognizer];&
&&&&&&&&&&&&
&&&&&&& case 2:&
&&&&&&&&&&& [self createPanGestureRecognizer];&
&&&&&&&&&&&&
&&&&&&& case 3:&
&&&&&&&&&&&&
&&&&&&&&&&& [self createRotationGestureRecognizer];&
&&&&&&&&&&&&
&&&&&&& case 4:&
&&&&&&&&&&&&&
&&&&&&&&&&& [self createPinchGestureRecognizer];&
&&&&&&&&&&&&
&&&&&&& case 5:&
&&&&&&&&&&& if (isTopDownOfRightLeft == YES) {&
&&&&&&&&&&&&&&& [self createVerticalSwipeGestureRecognizer];&
&&&&&&&&&&&&&&& isTopDownOfRightLeft = NO;&
&&&&&&&&&&& } else {&
&&&&&&&&&&&&&&& [self createHorizontanlSwipeGesture];&
&&&&&&&&&&&&&&& isTopDownOfRightLeft = YES;&
&&&&&&&&&&& }&
&&&&&&&&&&&&
&&&&&&& default:&
&&&&&&&&&&&&
#pragma mark - 重置imageView&
- (void)resetImageView&
&&& for (int i = 0; i & [self.imageView.gestureRecognizers count]; i++) {&
&&&&&&& [self.imageView removeGestureRecognizer:[self.imageView.gestureRecognizers objectAtIndex:i]];&
&&& self.imageView.alpha = 1.0;&
&&& self.imageView.transform = CGAffineTransformI&
&&& self.imageView.frame = _originalR&
&&& self.imageView.image = [UIImage imageNamed:_originalImageName];&
- (void)didReceiveMemoryWarning&
&&& [super didReceiveMemoryWarning];&
&&& // Dispose of any resources that can be recreated.&
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 ios 长按手势 的文章

 

随机推荐