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,一经查实,立即删除!

相关文章

WPF 基础控件之 GroupBox样式

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

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

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

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

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

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

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

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

C# Barrier类

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

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

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

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

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

[异常解决] ubuntu上安采用sudo启动的firefox,ibus输入法失效问题解决

采用sudo启动的应用是root权限的应用, ibus失效是因为ibus的初始配置采用user权限: 而root下运行的firefox输入法的配置还是停留在默认情况~ 解决方案是在shell下以root权限运行ibus,然后进行配置: 1、shell下输入:sudo ibus-setu…

Avalonia-.NET 的跨平台 UI 框架

简介Avalonia 是 dotnet 的跨平台 UI 框架,提供灵活的样式系统并支持 Windows、Linux、macOS 等多种操作系统。Avalonia 已经成熟并且可以投入生产。我们还在测试版中支持 iOS、Android,并在早期阶段通过 WASM 支持浏览器。使用在WPF中,当你在…

Skype for TV停止支持 三星确认今年6月移除该应用

微软热门视频聊天和语音通话服务Skype自今天开始将不再支持智能电视。用户无法在智能电视上登录或者重置密码。在停止支持之后,由电视制造厂商自行决定移除Skype应用或者继续提供非支持版本。三星已经确认将于2016年6月2日开始在旗下的智能电视中移除Skype服务&…

CactiEZ V10.1 中文版 Cacti中文解决方案+使用教程(2)

配置被监控的Windows主机说明:要使用CactiEZ监控一台Windows主机,需要在被监控的主机上面安装snmp(简单网络管理协议)1、下面开始安装配置snmp开始-设置-控制面板-添加或删除程序-添加删除Windows组件找到管理和监视工具&#xff…

AgileConfig 1.6.0 发布 - 支持服务注册与发现

大家好,好久没有输出博文了,一是因为比较忙,另外一个原因是最近主要的精力是在给 AgileConfig 添加一个新的功能:服务注册与发现。先说说为什么会添加这个功能。我自己的项目是用 Consul 来做为服务注册发现组件的。自从我上线了 …

快速排序算法_Python实现快速排序算法

排序是算法的入门知识,应用广泛,且在程序员面试中,经常被提及,其中最常考的两大排序算法为快速排序与归并排序,本篇将使用Python语言来分析了解快速排序算法。思想 快速排序是一种非常高效的排序算法,采用 …

用户反馈KB3189866累积更新出现卡在95%进度情况

伴随着本月的补丁星期二活动,微软面向Windows 10推出了三款累积更新。和以往相同,部分用户反馈称无法安装本次更新并导致出现各种问题。很多读者反馈称KB3189866累积更新会在45%或95%的时候卡住不动,无法执行和完成安装。 在尝试过几种临时解…

UVa1607 poj1435 UVaLive1686 Gates

填坑系列(p.246) 由函数连续性得满足二分性 1 #include<cstdio>2 #include<cstring>3 #include<cstdlib>4 #include<algorithm>5 #include<iostream>6 7 using namespace std;8 9 void setIO(const string& s) { 10 freopen((s ".…

c语言入门数组,C语言入门之数组(2)

二维数组前面介绍的数组只有一个下标&#xff0c;称为一维数组&#xff0c; 其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的&#xff0c; 因此C语言允许构造多维数组。多维数组元素有多个下标&#xff0c; 以标识它在数组中的位置&#xff0c;所以也称为多…

IOS开发--TextField

2019独角兽企业重金招聘Python工程师标准>>> //初始化text field的位置和大小UITextField *text [[UITextField alloc] initWithFrame:CGRectMake(20, 20, 130, 130)];//设置边框样式//样式有很多种&#xff0c;点进去查看text.borderStyle UITextBorderStyleRoun…