iOS开发之手势识别

感觉有必要把iOS开发中的手势识别做一个小小的总结。在上一篇iOS开发之自定义表情键盘(组件封装与自动布局)博客中用到了一个轻击手势,就是在轻击TextView时从表情键盘回到系统键盘,在TextView中的手是用storyboard添加的。下面会先给出如何用storyboard给相应的控件添加手势,然后在用纯代码的方式给我们的控件添加手势,手势的用法比较简单。和button的用法类似,也是目标动作回调,话不多说,切入今天的正题。总共有六种手势识别:轻击手势(TapGestureRecognizer),轻扫手势(SwipeGestureRecognizer), 长按手势(LongPressGestureRecognizer),  拖动手势(PanGestureRecognizer), 捏合手势(PinchGestureRecognizer),旋转手势(RotationGestureRecognizer);
其实这些手势用touche事件完全可以实现,苹果就是把常用的触摸事件封装成手势,来提供给用户。读者完全可以用TouchesMoved来写拖动手势等
一,用storyboard给控件添加手势识别,当然啦用storyboard得截张图啦
1.用storyboard添加手势识别,和添加一个Button的步骤一样,首先我们得找到相应的手势,把手势识别的控件拖到我们要添加手势的控件中,截图如下:
2.给我们拖出的手势添加回调事件,和给Button回调事件没啥区别的,在回调方法中添加要实现的业务逻辑即可,截图如下:
二,纯代码添加手势识别
用storyboard可以大大简化我们的操作,不过纯代码的方式还是要会的,就像要Dreamwear编辑网页一样(当然啦,storyboard的拖拽功能要比Dreamwear的拖拽强大的多),用纯代码敲出来的更为灵活,更加便于维护。不过用storyboard可以减少我们的工作量,这两个要配合着使用才能大大的提高我们的开发效率。个人感觉用storyboard把框架搭起来(Controller间的关系),一下小的东西还是用纯代码敲出来更好一些。下面就给出如何给我们的控件用纯代码的方式来添加手势识别。
1.轻击手势(TapGestureRecognizer)的添加
初始化代码TapGestureRecongnizer的代码如下:
1     //新建tap手势
2     UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)];
3     //设置点击次数和点击手指数
4     tapGesture.numberOfTapsRequired = 1; //点击次数
5     tapGesture.numberOfTouchesRequired = 1; //点击手指数
6     [self.view addGestureRecognizer:tapGesture];
在回调方法中添加相应的业务逻辑:
1 //轻击手势触发方法
2 -(void)tapGesture:(id)sender
3 {
4     //轻击后要做的事情
5 }
2.长按手势(LongPressGestureRecognizer)
初始化代码:
1     //添加长摁手势
2     UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressGesture:)];
3     //设置长按时间
4     longPressGesture.minimumPressDuration = 0.5; //(2秒)
5     [self.view addGestureRecognizer:longPressGesture];
在对应的回调方法中添加相应的方法(当手势开始时执行):
1 //常摁手势触发方法
2 -(void)longPressGesture:(id)sender
3 {
4     UILongPressGestureRecognizer *longPress = sender;
5     if (longPress.state == UIGestureRecognizerStateBegan)
6     {
7         UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"提示" message:@"长按触发" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles: nil];
8         [alter show];
9     }
10 }
代码说明:手势的常用状态如下
开始:UIGestureRecognizerStateBegan
改变:UIGestureRecognizerStateChanged
结束:UIGestureRecognizerStateEnded
取消:UIGestureRecognizerStateCancelled
失败:UIGestureRecognizerStateFailed
3.轻扫手势(SwipeGestureRecognizer)
在初始化轻扫手势的时候得指定轻扫的方向,上下左右。 如果要要添加多个轻扫方向,就得添加多个轻扫手势,不过回调的是同一个方法。
添加轻扫手势,一个向左一个向右,代码如下:
1     //添加轻扫手势
2     UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGesture:)];
3     //设置轻扫的方向
4     swipeGesture.direction = UISwipeGestureRecognizerDirectionRight; //默认向右
5     [self.view addGestureRecognizer:swipeGesture];
6
7     //添加轻扫手势
8     UISwipeGestureRecognizer *swipeGestureLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGesture:)];
9     //设置轻扫的方向
10     swipeGestureLeft.direction = UISwipeGestureRecognizerDirectionLeft; //默认向右
11     [self.view addGestureRecognizer:swipeGestureLeft];
回调方法如下:
1 //轻扫手势触发方法
2 -(void)swipeGesture:(id)sender
3 {
4     UISwipeGestureRecognizer *swipe = sender;
5     if (swipe.direction == UISwipeGestureRecognizerDirectionLeft)
6     {
7         //向左轻扫做的事情
8     }
9     if (swipe.direction == UISwipeGestureRecognizerDirectionRight)
10     {
11         //向右轻扫做的事情
12     }
13 }
14
4.捏合手势(PinchGestureRecognizer)
捏合手势初始化
1     //添加捏合手势
2     UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGesture:)];
3     [self.view addGestureRecognizer:pinchGesture];
捏合手势要触发的方法(放大或者缩小图片):
1 捏合手势触发方法
2 -(void) pinchGesture:(id)sender
3 {
4      UIPinchGestureRecognizer *gesture = sender;
5
6     //手势改变时
7     if (gesture.state == UIGestureRecognizerStateChanged)
8     {
9         //捏合手势中scale属性记录的缩放比例
10         _imageView.transform = CGAffineTransformMakeScale(gesture.scale, gesture.scale);
11     }
12
13     //结束后恢复
14     if(gesture.state==UIGestureRecognizerStateEnded)
15     {
16         [UIView animateWithDuration:0.5 animations:^{
17             _imageView.transform = CGAffineTransformIdentity;//取消一切形变
18         }];
19     }
20 }
5.拖动手势(PanGestureRecognizer)
拖动手势的初始化
1     //添加拖动手势
2     UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGesture:)];
3     [self.view addGestureRecognizer:panGesture];
拖动手势要做的方法(通过translationInView获取移动的点,和TouchesMoved方法类似)
1 //拖动手势
2 -(void) panGesture:(id)sender
3 {
4     UIPanGestureRecognizer *panGesture = sender;
5
6     CGPoint movePoint = [panGesture translationInView:self.view];
7
8     //做你想做的事儿
  9 }
6.旋转手势(RotationGestureRecognizer)
旋转手势的初始化
1     //添加旋转手势
2     UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationGesture:)];
3     [self.view addGestureRecognizer:rotationGesture];
旋转手势调用的方法:
1 //旋转手势
2 -(void)rotationGesture:(id)sender
3 {
4
5     UIRotationGestureRecognizer *gesture = sender;
6
7     if (gesture.state==UIGestureRecognizerStateChanged)
8     {
9         _imageView.transform=CGAffineTransformMakeRotation(gesture.rotation);
10     }
11
12     if(gesture.state==UIGestureRecognizerStateEnded)
13     {
14
15         [UIView animateWithDuration:1 animations:^{
16             _imageView.transform=CGAffineTransformIdentity;//取消形变
17         }];
18     }
19
20 }
上面的东西没有多高深的技术,就是对iOS开发中的手势做了一下小小的总结,温故一下基础知识。

最新内容请见作者的GitHub页:http://qaseven.github.io/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IOS学习笔记之十一(包装类、description、isequal)

1、下面的类不是包装类 1)、NSInteger(64位相对于long) 2)、NSUInteger(64位相对于unsigned long) 3)、CGFLoat(64位相对于double, 32位相对于float) 2、下面类是包装类 1)、NSValue NSValue是NSNumber的父类 2)、NSNumber 一般方法 numberWith***:把指定类…

WPF 基础控件之 GroupBox样式

其他基础控件1.Window2.Button3.CheckBox4.ComboBox5.DataGrid 6.DatePicker7.ExpanderGroupBox控件修改Style需要注意使用Grid分两行进行展示第0行显示Header第1行显示Content。Header:添加Border并边框BorderThickness"1" 内部新增 ContentPresenter 然…

软件测试的目的

测试的目的是什么呢?这是一个看起来很简单、不太值得讨论的问题,但往往这样的问题其实是很难回答的,比如人生的意义是什么?好,现在我们就来,列举一下我们经常听到的对这个问题的回答:“软件测试…

并联系统的失效率公式推导_供暖系统水力平衡率对室温的影响

摘要:热水供暖系统设计,为了保证室内能够达到设计温度,必须使流进散热器的热水流量与房间的热负荷相匹配,散热器才能散发足够热量以弥补由于建筑物围护结构散失的热量,保证室内温度。供暖系统设计只有通过正确的水力计…

面向对象——一起来复习托付与事件!

事件与托付事实上并不难理解。仅仅是由于它们的使用方式与经常使用的编码有非常大的区别,例如通常编写的都是同步代码,调用一个类型的方法,会即刻出现方法运行的结果。这是符合逻辑的。但在某些情况中,同步代码未必满足需求&#…

VS2008打包(含水晶报表)与安装注意事项

1、解决使用次数限制 修改下面两项注册值为1000: HKEY_LOCAL_MACHINE\SOFTWARE\Business Objects\10.5\Report Application Server\InprocServer\PrintJobLimit HKEY_LOCAL_MACHINE\SOFTWARE\Business Objects\10.5\Report Application Server\Server\PrintJobLimit 2、添…

为何Windows版QuickTime突然寿终正寝?

在QuickTime中两个零日漏洞被披露、且苹果公司突然停止支持该软件后,美国国土安全部和趋势科技公司发布安全公告建议用户卸载Windows版QuickTime。苹果公司随后宣布Windows版QuickTime寿终正寝。为什么苹果不修复这些漏洞,或者至少提前告知用户其结束Qui…

IOS学习笔记十二(类别和扩展)

1、类别(category)和扩展 类别:OC动态特征许使用类别添加新的方法,不需要创建子类 扩展:和类别相似,扩展相对于匿名类别 2、使用格式 类别:interface 已有类(类别名)…end implmentaion 已有类(类别名)…end 扩展:im…

Blazor University (7)组件 — 双向绑定

原文链接:https://blazor-university.com/components/two-way-binding/双向绑定源代码[1]注意: 如果您还没有这样做过,请在继续本节之前先执行单向绑定[2]中的步骤。到目前为止,我们有一个包含嵌入组件的页面,并且我们…

【iCore3 双核心板】例程二十二:LAN_UDP实验——以太网数据传输

实验指导书及代码包下载: http://pan.baidu.com/s/1kTPlJMJ iCore3 购买链接: https://item.taobao.com/item.htm?id524229438677 转载于:https://www.cnblogs.com/xiaomagee/p/5084291.html

想了好久 请多多指教

条件:假设A公司光纤入网,isp给的是静态ip,应该是公网ip吧然后搭建了DNS服务器和WEB服务器,(当然自己建了个企业网站,备过案)目的是在使全世界的客户都能访问到A公司的企业网站----------------------------…

喜欢的名言警句

有志者、事竟成,破釜沉舟,百二秦关终属楚; 苦心人、天不负,卧薪尝胆,三千越甲可吞吴。 1、If not now, when? If not me, who? ---马云 2、一个成功的创业者,三个因素:眼光、胸怀和实力。---…

tomcat出现5个using_当猫咪出现这5个迹象,主人就要给猫咪换猫粮了

养宠的朋友们你们知道吗?猫咪最好是要定期换粮,这样才有助于猫咪营养平衡,并且避免猫咪对单一食物感到厌烦哦!但是应该多久给猫咪换一次粮呢?如果你家猫咪出现这5个迹象时,那就是提醒你需要更换猫粮了&…

C# Barrier类

对于同步,Barrier 类非常适用于其中工作有多个任务分支且以后又需要合并工作的情况。Barrier 类用于需要同步的参与者。激活一个任务时,就可以动态地添加其他参与者,例如,从父任务中创建子任务。参与者在继续之前,可以…

特斯拉宣布将在欧洲建设第二座超级工厂

北京时间11月9日早间消息,特斯拉CEO伊隆马斯克(Elon Musk)和首席技术官JB斯特罗贝尔(JB Straubel)本周在德国宣布了对德国工程集团Grohmann Engineering的收购。在随后的发布会上,马斯克强调,特…

IOS学习笔记十三(使用类别实现非正式协议)

1、协议 可以理解为java里面的接口 2、测试Demo NSObjectchenyu.h #ifndef NSObject_chenyu_h #define NSObject_chenyu_h #import <Foundation/Foundation.h>interface NSObject(chenyu) -(void)test; end#endif /* NSObject_chenyu_h */ Org.h #ifndef Org_h#defin…

c语言程序设计的顺序结构的常用控制语句,C语言程序设计教程-第03课-顺序结构的程序设计.ppt...

《C语言程序设计教程-第03课-顺序结构的程序设计.ppt》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《C语言程序设计教程-第03课-顺序结构的程序设计.ppt(21页珍藏版)》请在人人文库网上搜索。1、第3章 顺序结构的程序设计,3.1 顺序结构问题的提出 3.2 赋 值 语 句 3…

Android版哆啦A梦连连看游戏源码完整版

本代码主本人编写&#xff0c;没版权问题&#xff0c;另有其他少量小游戏和应用源码稍后会陆续上线!哆啦A梦连连看包括了2种游戏模式和60关卡&#xff0c;并可以通过修改配置文件很方便的实现自行增加新关卡。采用andengine游戏引擎开发&#xff0c;内置了趣米广告和用户统计fl…

javascript 高级程序设计_重读《JavaScript高级程序设计》

最近自己在休假&#xff0c;打算闭门几天将《JavaScript高级程序设计》(第3版)这本良心教材再回顾一遍。目前自己进入前端领域两年多&#xff0c;现在重读并记录下这本教材的“硬”知识点 。本文原文链接请戳 重读《JavaScript高级程序设计》​link.jianshu.com函数没有重载ECM…