关于ios的手势识别(GestureRecognizers)讲解
大家都知道,苹果的设备,不管是mac机器还是iPhone或iad,都支持多点触控,进而延伸了多种手势识别的功能。这为用户带来了很大的便携性和多样灵活性,极大的方便了用户的使用。足以见手势识别(GestureRecognizers)在开发中也有举足轻重的作用。
在iOS 4以前,手势识别由开发人员负责。
主要使用的是由UIResponder而来的如下4种方式:
- (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
这往往需要进行复杂的数学运算才能甄别不用的手势,苹果意识到这种情况的复杂性和手势对iPhone用户界面的重要性之后,在iOS4中加入了UIGestureRecognizer类,使开发者更容易实现各种手势的识别。
UIGestureRecognizer类是继承自Nsobject的抽象类,它派生的6个主要子类分别诠释了不同的手势识别。
- UITapGestureRecognizer – “轻击”手势。可以配置为“单击”和“连击”的识别。
- UIPinchGestureRecognizer –“捏合”手势。该手势通常用于缩放视图或改变可视组件的大小。
- UIPanGestureRecognizer – “平移”手势。识别拖拽或移动动作。
- UISwipeGestureRecognizer – “轻扫”手势。当用户从屏幕上划过时识别为该手势。可以指定该动作的方向(上、下、左、右)。
- UIRotationGestureRecognizer – “转动”手势。用户两指在屏幕上做相对环形运动。
- UILongPressGestureRecognizer – “长按”手势。使用1指或多指触摸屏幕并保持一定时间。
这些手势识别器必需和视图通过addGestureRecognizer:方法联系在一起。识别器必需指定一个响应方法以便发生指定手势时进行调用。removeGestureRecognizer:方法可以将识别器从视图中移出,方法参数指定要移除的识别器.
识别器响应消息
iOS 4 的手势识别器在侦测到某个手势发生时,使用目标-动作模型去通知应用程序。当一个识别器被创建之后,只要有对应的手势发生,就会调用创建时指定的方法。
连续和不连续手势
手势分为“连续手势”和“不连续手势”两种。“不连续手势”只会导致调用响应方法一次。“轻击”(包括多击)仅仅会触发一次响应方法。而“轻扫”、“平移”、“旋转”、“捏合”则是连续手势,它们会连续不断地调用响应方法直到手势结束。
从手势中获取数据
每个手势响应方法都会被传入一个UIGestureRecognizer* sender对象,从中可以获取到和手势有关的信息。例如,对于“捏合”手势,可以通过这个参数获取缩放系数、捏合速度。对于“转动”手势,则可以获得转动的次数及速度。
识别轻击手势
轻击手势使用UITapGestureRecognizer类进行识别。在alloc和init时必需指定一个手势触发时调用的方法引用(即selector选择器)。使用numberOfTapsRequired属性可以定义轻击必需被连续操作的次数。如以下代码所示,当识别器侦测到连续轻击2次时,将触发tapDetected:方法。
-(void) tapGestureRecognizeTest
{
UITapGestureRecognizer *doubleTap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapDeteted:)];
doubleTap.numberOfTapsRequired=2;
[self.parentUiView addGestureRecognizer:doubleTap];
[doubleTap release];
}
-(IBAction)tapDeteted:(UIGestureRecognizer *)sender
{
NSLog(@"双击手势");
}
识别捏合手势
捏合手势使用UIPinchGestureRecognizer类识别。例如:
-(void) pinchGestureRecongnizeTest
{
UIPinchGestureRecognizer *pinshGesture=[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinshDeteted:)];
[self.parentUiView addGestureRecognizer:pinshGesture];
[pinshGesture release];
}
-(IBAction)pinshDeteted:(UIGestureRecognizer *)sender
{
NSLog(@"此触摸手势为%@",@"捏合手势");
}
识别转动手势
转动手势使用UIRotationGestureRecognizer类。
UIRotationGestureRecognizer *rotationRecognizer =
[[UIRotationGestureRecognizer alloc]
initWithTarget:self
action:@selector(rotationDetected:)];
[self.view addGestureRecognizer:rotationRecognizer];
[rotationRecognizer release];
识别平移手势
平移手势使用UIPanGestureRecognizer 类。平移手势是最基本的连续手势。例如手指在屏幕上随意乱划可以被识别为平移或拖拽操作:
UIRotationGestureRecognizer *panRecognizer =
[[UIPanGestureRecognizer alloc]
initWithTarget:self
action:@selector(panDetected:)];
[self.view addGestureRecognizer:panRecognizer];
[panRecognizer release];
如果轻扫和平移都添加在同一个view中,那么很可能大部分轻扫手势都会被识别为平移。而且如果两种手势被添加到同一个view时,会产生一个警告。
识别轻扫手势
轻扫手势使用 UISwipeGestureRecognizer 类。所有的轻扫都将被识别,或者你可以指定只侦测方向为以下常量的轻扫:
- UISwipeGestureRecognizerDirectionRight
- UISwipeGestureRecognizerDirectionLeft
- UISwipeGestureRecognizerDirectionUp
- USwipeIGestureRecognizerDirectionDown
如果不指定direction属性,默认只侦测方向为右的轻扫。以下代码设置只侦测向上轻扫:
UISwipeGestureRecognizer *swipeRecognizer =
[[UISwipeGestureRecognizer alloc]
initWithTarget:self
action:@selector(swipeDetected:)];
swipeRecognizer.direction = UISwipeGestureRecognizerDirectionUp; [self.view addGestureRecognizer:swipeRecognizer];
[swipeRecognizer release];
识别长按手势
长按手势使用 UILongPressGestureRecognizer 类。这个手势需要指定长按的时间,触摸的次数,点击的次数以及在触摸过程中是否允许移动。这些选项分别由minimumPressDuration, numberOfTouchesRequired, numberOfTapsRequired 和allowableMovement 属性指定。以下代码使识别器只侦测单指长按3秒以上的手势。allowableMovement未指定,默认是允许10个像素的移动:
UILongPressGestureRecognizer *longPressRecognizer =
[[UILongPressGestureRecognizer alloc]
initWithTarget:self
action:@selector(longPressDetected:)]; longPressRecognizer.minimumPressDuration = 3;
longPressRecognizer.numberOfTouchesRequired = 1;
[self.view addGestureRecognizer:longPressRecognizer];
[longPressRecognizer release];
注:ios模拟器使用捏合手势时,按住option键。然后结合鼠标模拟。 触摸手势说明: (1)右键按住+移动鼠标向左=放大; (2)右键按住+移动鼠标向右=缩小; (3)右键按住+移动鼠标向上=前倾; (4)右键按住+移动鼠标向下=后倾
关于ios的手势识别(GestureRecognizers)讲解的更多相关文章
- IOS UITableView NSIndexPath属性讲解
IOS UITableView NSIndexPath属性讲解 查看UITableView的帮助文档我们会注意到UITableView有两个Delegate分别为:dataSource和deleg ...
- IOS添加手势识别
ios里面有手势识别,多点触控等功能,过去要实现手势识别很复杂,现在苹果为我们实现了,手势识别变得很简单 1.向视图添加手势识别器:(一般由controller完成,有时View也可以添加) 2.提供 ...
- iOS 解析手势识别(Gesture Recognizers)
一.Gesture Recognizers Gesture Recognizers是在iOS3.2引入的,可以用来识别手势.简化定制视图事件处理的对象.Gesture Recognizers的基类为U ...
- iOS图形手势识别框架SGGestureRecognizer
简介 苹果官方为我们提供了简单手势的识别器,但对于图形手势,例如五角星.三角形等的识别,就需要自己实现了.通过识别这些手势,可以去执行特定的操作,或是输入公式.释放魔法等,可以为App增光添彩. 下载 ...
- iOS七大手势识别
也没有什么好说的,方法都差不多,只要记得当你想要同时实现两个或多个手势的话,要遵守<UIGestureRecognizerDelegate>协议,闲言休叙,直接上代码: #import & ...
- iOS基础 - 手势识别 与 手势说明
一.使用手势识别的四个步骤 1> 实例化手势识别 - (id)initWithTarget:(id)target action:(SEL)action; 2> 设置手势识别属性 3> ...
- iOS Runloop的超级讲解
这是目前看过的最好的一片中文讲解RunLoop的文章,推荐给大家看一下,原文链接:http://blog.ibireme.com/2015/05/18/runloop/ https://segment ...
- iOS 声明属性关键字讲解
atomic: 原子操作(原子性是指事务的一个完整操作,操作成功就提交,反之就回滚. 原子操作就是指具有原子性的操作)在objective-c 属性设置里面 默认的就是atomic ,意思就是 set ...
- iOS移动开发CoreDate讲解
----欢迎------- 在移动端开发,数据持久化保存是基本要素,没钱在2014年之后退出了coredate,本持久化基于oc作为开发,方便程序人员操作.与SQL数据库,MySQL相比,优点颇多. ...
随机推荐
- Jquery ajax 得到返回值
Jquery ajax 得到返回值 1.ajax默认是异步调用的,所以得到的返回值是空值,要得到值必须改成同步:async: false,//同步. 2.必须定义一个全局变量 var result = ...
- .NET ORM框架(一)
最近做项目自己整理了一个ORM框架,分享给大家看看,有很多不足望大家指出. 下面是使用方法 BLL 主要方法 逻辑层:子类继承父类, 直接用BASE调用 ManagerBLL 中的方法. public ...
- MSSQLSERVER数据库- 作业调度定时备份数据库
作业调度和备份数据库是常见的行为,掌握这两项技术我觉的非常有必要. 在网上找到这个示例,记录在这里 备份数据库的SQL语句 --自动备份并保存最近5天的SQL数据库作业脚本 ) DECLARE @da ...
- iOS动画详解(一)
Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎.它提供了低级别.轻量级.高保真度的2D渲染.该框架可以用于基于路径的绘图.变换.颜色管理.脱屏渲 ...
- 如何关闭UINavigationController 向右滑动 返回上一层视图
说明一下: 我的nav 设置的rootview 是 tabbarcontroller,登录界面是push进去的,所以,在登录界面,如果靠近最左边 向右滑动 会出现 tabbarcontroller的视 ...
- C++ 变量初始化规则
1.定义变量的时候,如果没有初始化,它的值是什么呢? 它的值取决于变量的类型和变量定义的位置. 2.考虑基本类型的变量,定义时没有初始化.如果定义在方法外部,初始化为0,如果定义在方法内部,不被初始化 ...
- [安卓开发]App Widget开发入门指导
本节所要讲的主要内容包括Android桌面小部件.App Widget的开发入门指导,并通过一个简单实例的形式来直观的讲解App Widget. 一.Widget .App Widget .Web A ...
- iOS开发——新特性OC篇&Swift 2.0新特性
Swift 2.0新特性 转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度 ...
- 学习笔记之Lucene
http://baike.baidu.com/view/371811.htm?fr=aladdin Apache Lucene(http://lucene.apache.org/) Java 全文搜索 ...
- [Effective C++ --005]了解C++默默编写并调用哪些函数
<前言>编译器是个十分敬业的工作者,不但为你编译代码,甚至为你生成代码,不可思议吧.本文主要介绍编译器究竟会为我们生成和调用哪些代码. <空类和非空类>如果问什么样的类是空类? ...