iOS手势共存

【手势识别-UIPinchGestureRecognizer捏合-UIPanGestureRecognizer缩放 Objective-C语言】 阅读详情

转自:http://www.cnblogs.com/gaoxiao228/archive/2012/05/17/2506045.html

IOS开发之手势——UIGestureRecognizer 共存

 在 iPhone 或 iPad 的开发中,除了用 touchesBegan / touchesMoved / touchesEnded 这组方法来控制使用者的手指触控外,也可以用 UIGestureRecognizer 的衍生类別来进行判断。用 UIGestureRecognizer 的好处在于有现成的手势,开发者不用自己计算手指移动轨迹。UIGestureRecognizer的衍生类別有以下几种:

  • UITapGestureRecognizer
  • UIPinchGestureRecognizer
  • UIRotationGestureRecognizer
  • UISwipeGestureRecognizer
  • UIPanGestureRecognizer
  • UILongPressGestureRecognizer


从命名上不难了解這些类別所对应代表的手势,分別是 Tap(点一下)、Pinch(二指往內或往外拨动)、Rotation(旋转)、Swipe(滑动,快速移动)、Pan (拖移,慢速移动)以及 LongPress(长按)。這些手势別在使用上也很简单,只要在使用前定义并添加到对应的视图上即可。

复制代码
复制代码
// 定义一个 recognizer, 并加到需要偵測该手势的 UIView 元件上
- (void)viewDidLoad {
UISwipeGestureRecognizer* recognizer;
// handleSwipeFrom 是偵測到手势,所要呼叫的方法
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:selfaction:@selector(handleSwipeFrom)];
// 不同的 Recognizer 有不同的实体变数
// 例如 SwipeGesture 可以指定方向
// 而 TapGesture 則可以指定次數
recognizer.direction = UISwipeGestureRecognizerDirectionUp
[self.view addGestureRecognizer:recognizer];
[recognizer release];
}

- (void)handleSwipeFrom:(UISwipeGestureRecognizer*)recognizer {
// 触发手勢事件后,在这里作些事情

// 底下是刪除手势的方法
[self.view removeGestureRecognizer:recognizer];
}
复制代码
复制代码

问题來了。有些手势其实是互相关联的,例如 Tap 与 LongPress、Swipe与 Pan,或是 Tap 一次与Tap 兩次。当一個 UIView 同时添加兩个相关联的手势时,到底我这一下手指头按的要算是 Tap 还是 LongPress?如果照預设作法来看,只要「先滿足条件」的就会跳出并呼叫对应方法,举例来说,如果同时注册了 Pan 和 Swipe,只要手指头一移动就会触发 Pan 然后跳出,因而永远都不會发生 Swipe;单点与双点的情形也是一样,永远都只会触发单点,不會有双点。

那么这个问题有解吗?答案是肯定的,UIGestureRecognizer 有个方法叫做requireGestureRecognizerToFail,他可以指定某一个 recognizer,即便自己已经滿足條件了,也不會立刻触发,会等到该指定的 recognizer 确定失败之后才触发。以同时支持单点与双点的手势为例,代码如下:

复制代码
- (void)viewDidLoad {
// 单击的 Recognizer
UITapGestureRecognizer* singleRecognizer;
singleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:selfaction:@selector(handleSingleTapFrom)];
singleTapRecognizer.numberOfTapsRequired = 1; // 单击
[self.view addGestureRecognizer:singleRecognizer];

// 双击的 Recognizer
UITapGestureRecognizer* double;
doubleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:selfaction:@selector(handleDoubleTapFrom)];
doubleTapRecognizer.numberOfTapsRequired = 2; // 双击
[self.view addGestureRecognizer:doubleRecognizer];

// 关键在这一行,如果双击确定偵測失败才會触发单击
[singleRecognizer requireGestureRecognizerToFail:doubleRecognizer];
[singleRecognizer release];
[doubleRecognizer release];
}




用UIGestureRecognizer侦测使用者输入操作

    在3.2以前,我们要拿到UITouch跟使用者互动,大部分都是透过UIResponder的四种methods

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

    有些人会把UITouch重新wrap丢到自己的queue里面去处理,不然就是直接在这几个function里直接判断。其实都不会差太多。简单的说,就是麻烦

    3.2以后,透过UIGestureRecognizer及其它继承它的UIxxxGestureRecognizer,侦测使用者输入就变的简单许多。

 UILongPressGestureRecognizer
 UIPanGestureRecognizer
 UIPinchGestureRecognizer
 UIRotationGestureRecognizer
 UISwipeGestureRecognizer
 UITapGestureRecognizer

    照名字看大概就知道这是做什么用的,所以就不解释了,直接看用法:

    以UIPanGestureRecognizer为例,这是处理使用者用一只手指(或多只)在屏幕上滑来滑去的动作。要侦测这个动作,只要加下面这段code进viewDidLoad或任何你需要的地方

UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];
[self.view addGestureRecognizer:panRecognizer];
panRecognizer.maximumNumberOfTouches = 1;
panRecognizer.delegate = self;
[panRecognizer release];

    第 一个很简单,就是确定要给这个recognizer handle的event,就会去call这个class底下的handlePanFrom: 然后把recognizer加进UIView(addGestureRecognizer)。因为同时间我只想知道一只手指的动作,所以我用 maximumNumberOfTouches=1来限制。

    当然,你可以改变maximumNumberOfTouches跟minimumNumberOfTouches的值来当成filter,接着把 delegate设定成自己(记得header要加上UIGestureRecognizerDelegate)。

    不过这样还没有结束,我们要补上这个delegate method

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {

    里面可以先filter event,决定要不要丢给一开始assign给panRecognizer的selector function,
譬如我只想要看某个subview的事件

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    UIView *aview = [self.view viewWithTag:1000];
    if (touch.view != aview) {
      return NO; // 不理這個event
    }
    return YES;
 }

    接下来就是

- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer {        
         //拿到手指目前的位置
         CGPoint location = [recognizer locationInView:self.view];
         UIView *aview = [self.view viewWithTag:1000];

         // 如果UIGestureRecognizerStateEnded的話...你是拿不到location的
         // 不判斷的話,底下改frame會讓這個subview消失,因為origin的x和y就不見了!!!
         if(recognizer.state != UIGestureRecognizerStateEnded)
         {
                 aview.frame = CGRectMake(location.x, location.y, aview.frame.size.width, aview.frame.size.height);
         }
 }

    不 同的UIGestureRecognizer subclass都会有不同特点。譬如说Pinch的scale、velocity和Swipe的direction,直接简化了处理UITouch的步 骤。大家只要知道这些特点,处理使用者输入就会得心应手了。遇到问题记得先看看有没有判断UIGestureRecognizer的state。

UIGestureRecognizer手势识别详解 iOS应用开发过程,合理的使用手势识别功能来响应用户的操作,能够很好提升用户体验,为App增色。下面对UIGestureRecognizer手势进行一个比较全面的描述:      1、UIGestureRecognizer介绍            UIGestureRecognizer是手势识别的一个抽象类,没法直接使用。好心的苹果大神们已经为我们实现了常用的一些手势识别子类,具体列表如下: 阅读详情

相关推荐

UIGestureRecognizer学习之UIPinchGestureRecognizer(捏合)

UIPinchGestureRecognizer是UIGestureRecognizer的子类。 UIPinchGestureRecognizer除了继承UIGestureRecognizer的属性外,还提供如下俩个属性:scale: //获取捏合的比例 velocity: //获取捏合的速度示例:和前面的UITapGestureRecognizer的例子相似。- (void)viewDidLo

甫式人生 2939

iOS手势篇(六)-UIPinchGestureRecognizer详解

UIPinchGestureRecognizer(捏合手势).是iOS中的一个比较常见的手势,具体在系统应用的相册、微信应用图库等地方用到了.使用上.也比较简便,整个.h文件里头就只有俩属性. // Begins: when two touches have moved enough to be considered a pinch // Changes: when a finger moves...

MeteoriteMan的博客 2820

UIPinchGestureRecognizer的使用

UIPinchGestureRecognizer的使用

iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)

1、UIGestureRecognizer介绍 手势识别在iOS上非常重要,手势操作移动设备的重要特征,极大的增加了移动设备使用便捷性。 iOS系统在3.2以后,为方便开发这使用一些常用的手势,提供了UIGestureRecognizer类。手势识别UIGestureRecognizer类是个抽象类,下面的子类是具体的手势,开发这可以直接使用这些手势识别。 UITapGestureRecog...

空杯子 13万+

Python海康相机api---超简单入坑学习必看

海康官网下载相机驱动​安装好以后找到Python的开发文件目录参考:D:\MVS\MVS\Development\Samples\Python\MvImport这几个文件很重要,想调用海康相机取图会用到.​为了写代码方便可以把这几个文件拷贝一下,跟你的api主文件放在同一个文件夹下可以减少80%的烦恼.​。

weixin_59360687的博客 3478

Tesla V100 Windows 部署实战:从驱动安装到模式切换的避坑指南

本文是一份详细的Tesla V100在Windows系统下的部署实战指南。文章从硬件组装、系统选择讲起,重点阐述了驱动安装的正确方法,并深入剖析了将计算卡从TCC模式切换至WDDM模式的诱惑与潜在陷阱。最终,作者推荐保持默认TCC模式,并提供了使用nvidia-smi命令行等稳定可靠的显卡监控方案,旨在帮助用户避开常见坑点,高效利用这张专业计算卡进行AI计算等任务。

java5的博客 1706

IOS开发之手势——UIGestureRecognizer 共存

IOS开发之手势——UIGestureRecognizer 共存 在 iPhone 或 iPad 的开发中,除了用touchesBegan / touchesMoved / touchesEnded这组方法来控制使用者的手指触控外,也可以用UIGestureRecognizer的衍生类別来进行判断。用UIGestureRecognizer的好处在于有现成的手势,开发者...

abv10122的博客 320

Matlab系列之GUI设计基础

Matlab系列之GUI设计基础简介编辑界面菜单设计控件设计控件描述个人理解Matlab转译控件属性【1】外观与行为【2】控件对象的信息【3】回调函数【4】状态信息结束结束更多精彩,等你发现~ 简介 GUI即图形用户界面(Graphical User Interface),人机交互的一种方式,可以简化用户的操作,比如只需要点点窗口上的按键或者菜单选择等等,就可以实现一个复杂的功能,有点类似黑盒的操作吧。 本篇将主要介绍GUI的使用,以及一些功能,后续的篇章再使用GUI来设计实例。 打开GUI可以在Matla

Smart_Devil的博客 5万+

SGuard服务异常排查:Windows反作弊组件深度诊断指南

游戏反作弊系统(如ACE)依赖底层Windows服务实现环境可信验证,其核心组件SGuard并非普通进程,而是以LocalSystem权限运行的内核级安全服务。它通过驱动签名校验、服务依赖链控制和命名管道通信,构建运行时可信环境。技术价值在于平衡防护强度与游戏性能,在不显著拖慢帧率的前提下阻断内存篡改、DLL注入等高危行为。典型应用场景包括《绝地求生》《永劫无间》等主流竞技游戏的稳定匹配、网吧批量运维、MOD兼容调试及辅助工具开发。当出现‘未就绪’‘匹配卡顿’或‘托盘图标变灰’时,问题往往根植于服务启动类型

weixin_34342905的博客 411

一、Abaqus CAE 入门操作(薄膜应力计算)

一、Abaqus CAE 入门操作(薄膜应力计算)

A20802013的博客 4370

【安全加固】应对Sweet32攻击:TLS/SSL协议3DES漏洞深度解析与修复指南

本文深度解析了CVE-2016-2183(Sweet32攻击)漏洞,该漏洞利用TLS/SSL协议中3DES加密算法的64位块大小缺陷,通过大量数据流量实施“生日攻击”导致信息泄露。文章提供了从原理分析、系统排查到跨平台修复的完整指南,重点指导如何在Windows、Linux服务器及网络设备中禁用不安全的3DES密码套件,并采用AES-GCM等更安全的加密方式,以彻底修复此TLS/SSL漏洞。

weixin_29230649的博客 585

ios手势共存

在 iPhone 或 iPad 的开发中,除了用 touchesBegan / touchesMoved / touchesEnded 这组方法来控制使用者的手指触控外,也可以用 UIGestureRecognizer 的衍生类別来进行判断。用 UIGestureRecognizer 的好处在于有现成的手势,开发者不用自己计算手指移动轨迹。UIGestureRecognizer的衍生类別有以下几种

heyehao2008的专栏 749

zabbix 监控EMC存储

经过搜索,找到了脚本地址,该项目应该是模板原作者创建的,该项目也有zabbix模板,和上面的应该是相同的,我用的是上面的模板。./unity_get_state.py --api_ip='X.X.X.X' --api_port='443' --api_user='zabbix' --api_password='PASSWORD' --storage_name="zabbix web前端配置的主机名" --discovery。修改权限,给zabbix用户执行权限,模板调用时以zabbix用户执行。

wangyfde的专栏 3755

IOS开发之手势——UIGestureRecognizer 共存(转)

IOS开发之手势——UIGestureRecognizer 共存 在 iPhone 或 iPad 的开发中,除了用touchesBegan / touchesMoved / touchesEnded这组方法来控制使用者的手指触控外,也可以用UIGestureRecognizer的衍生类別来进行判断。用UIGestureRecognizer的好处在于有现成的手势,开发者...

weixin_30485799的博客 98

弹窗提示报错: F:\c\CFX5\bin\Debug\net9.0-windows10.0.26100.0\CFX5.dll 面向无法动态枚举工具箱项目的平台...如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 947

【LSTM回归预测】attention机制LSTM时间序列回归预测【含Matlab源码 1992期】

attention机制LSTM时间序列回归预测 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 2591
上一篇: iOS中的沙盒机制
下一篇: 关键帧动画CAKeyframeAnimation
lifreshman
博客等级 码龄17年 6粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值