iOS:手势的详解UIGestureReconizer
手势类:UIGestureReconizer
typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
UIGestureRecognizerStatePossible, //评估可能发生的手势状态
UIGestureRecognizerStateBegan, //手势开始状态
UIGestureRecognizerStateChanged, //手势持续状态
UIGestureRecognizerStateEnded, //手势结束状态
UIGestureRecognizerStateCancelled, //手势取消状态
UIGestureRecognizerStateFailed, //手势失败状态
UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded ; //确认的手势结束状态
};
@interface UIGestureRecognizer : NSObject
属性:
//手势状态
@property(nonatomic,readonly) UIGestureRecognizerState state;
//手势代理
@property(nonatomic,assign) id <UIGestureRecognizerDelegate> delegate;
//能否手势
@property(nonatomic, getter=isEnabled) BOOL enabled;
//手势触摸的视图
@property(nonatomic,readonly) UIView *view;
//是否取消触摸视图
@property(nonatomic) BOOL cancelsTouchesInView;
// 是否延迟触摸开始
@property(nonatomic) BOOL delaysTouchesBegan;
// 是否延迟触摸结束
@property(nonatomic) BOOL delaysTouchesEnded;
方法:
//初始化,创建手势,并响应事件
- (instancetype)initWithTarget:(id)target action:(SEL)action;
// 添加手势事件
- (void)addTarget:(id)target action:(SEL)action;
//移除手势事件
- (void)removeTarget:(id)target action:(SEL)action;
//指定一个手势失败,另一个手势才执行
- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer;
//返回当前触摸点坐标系
- (CGPoint)locationInView:(UIView*)view;
//返回触摸点个数
- (NSUInteger)numberOfTouches;
//返回指定视图中第几个触摸点的坐标系
- (CGPoint)locationOfTouch:(NSUInteger)touchIndex inView:(UIView*)view;
@end
手势的代理协议
@protocol UIGestureRecognizerDelegate <NSObject>
@optional
//询问一个手势接收者是否应该开始解释执行一个触摸接收事件
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;
//询问delegate,两个手势是否同时接收消息,返回YES同事接收。返回NO,不同是接收(如果另外一个手势返回YES,则并不能保证不同时接收消息)the default implementation returns NO。这个函数一般在一个手势接收者要阻止另外一个手势接收自己的消息的时候调用
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
//询问是否另外一个手势失败,这个手势才开始执行
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer ;
//询问是否这个手势是通过一个指定手势的触发才失败
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer ;
// 询问delegate是否允许手势接收者接收一个touch对, 返回YES,则允许对这个touch对象审核,NO,则不允许。这个方法在touchesBegan:withEvent:之前调用,为一个新的touch对象进行调用
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;
@end
@interface UITapGestureRecognizer : UIGestureRecognizer {
属性:
//点击次数,默认为1次
@property (nonatomic) NSUInteger numberOfTapsRequired;
//需要触摸的手指个数,默认为1个
@property (nonatomic) NSUInteger numberOfTouchesRequired;
@end
=====================================================
2、pinch捏合手势:放缩
@interface UIPinchGestureRecognizer : UIGestureRecognizer {
属性:
//放缩系数
@property (nonatomic) CGFloat scale;
//每秒放缩的速率
@property (nonatomic,readonly) CGFloat velocity;
@end
=====================================================
3、rotate旋转手势:旋转
@interface UIRotationGestureRecognizer : UIGestureRecognizer {
属性:
//旋转弧度
@property (nonatomic) CGFloat rotation;
//每秒旋转的速率
@property (nonatomic,readonly) CGFloat velocity;
@end
=====================================================
4、pan拖动手势:拖动
@interface UIPanGestureRecognizer : UIGestureRecognizer {
属性:
//需要的最少触摸手指数,默认为1
@property (nonatomic) NSUInteger minimumNumberOfTouches;
//需要的最多触摸手指数,默认为unit_max
@property (nonatomic) NSUInteger maximumNumberOfTouches;
//返回在指定视图中的坐标系
- (CGPoint)translationInView:(UIView *)view;
//设置在指定视图中的坐标系(可以用于复位操作)
- (void)setTranslation:(CGPoint)translation inView:(UIView *)view;
//返回拖动手势的速度,值是每秒移动过的坐标系point
- (CGPoint)velocityInView:(UIView *)view;
@end
=====================================================
5、longPress长按手势:长时间按下
@interface UILongPressGestureRecognizer : UIGestureRecognizer {
属性:
//需要按的次数,默认为0
@property (nonatomic) NSUInteger numberOfTapsRequired;
//需要触摸的手指数,默认为1
@property (nonatomic) NSUInteger numberOfTouchesRequired;
//长按的最小时间,默认为0.5秒
@property (nonatomic) CFTimeInterval minimumPressDuration;
//允许移动的唯一,默认为10
@property (nonatomic) CGFloat allowableMovement;
@end
=====================================================
6、swipe轻扫手势:轻轻扫过
轻扫方向枚举(位移运算,可以与或非)
typedef NS_OPTIONS(NSUInteger, UISwipeGestureRecognizerDirection) {
UISwipeGestureRecognizerDirectionRight = 1 << 0, //往右扫
UISwipeGestureRecognizerDirectionLeft = 1 << 1, //往左扫
UISwipeGestureRecognizerDirectionUp = 1 << 2, //向上扫
UISwipeGestureRecognizerDirectionDown = 1 << 3 //向下扫
};
@interface UISwipeGestureRecognizer : UIGestureRecognizer {
属性:
//需要触摸的手指数,默认为1
@property(nonatomic) NSUInteger numberOfTouchesRequired;
//手势轻扫的方向
@property(nonatomic) UISwipeGestureRecognizerDirection direction;
@end
===================================================
7、摇动手势

//一、tap手势(点击)
//1.创建手势识别对象
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap:)]; //2.设置属性
tap.numberOfTapsRequired = ; //需要按几次
tap.numberOfTouchesRequired = ; //需要几个点(手指)按 //3.把手势添加到视图中
[self.myView addGestureRecognizer:tap];
执行:
//tap手势识别的处理方法
-(void)tap:(UITapGestureRecognizer *)sender
{ UIView *view = sender.view; if ([view.backgroundColor isEqual:[UIColor redColor]])
{
view.backgroundColor = [UIColor greenColor];
}
else
{
view.backgroundColor = [UIColor redColor];
}
}

//二、pinch手势(放大、缩小)
UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinch:)];
[self.view addGestureRecognizer:pinch];
//pinch手势识别的处理方法
-(void)pinch:(UIPinchGestureRecognizer *)sender
{
if(sender.state == UIGestureRecognizerStateChanged)
{
//使用放射变换来放大和缩小
CGAffineTransform transform = self.myView.transform;
transform = CGAffineTransformScale(transform, sender.scale, sender.scale); self.myView.transform = transform;
} //复位
sender.scale = 1.0;
}
演示结果:(大图缩小成小图)

//三、rotate旋转的手势
UIRotationGestureRecognizer *rotate = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotate:)];
[self.view addGestureRecognizer:rotate];
执行:
//rotate手势识别的处理方法
-(void)rotate:(UIRotationGestureRecognizer *)sender
{
//持续性操作
if (sender.state == UIGestureRecognizerStateChanged)
{
//使用放射变换进行旋转
//self.myView.transform = CGAffineTransformMakeRotation(sender.rotation);(不用复位) CGAffineTransform transform = self.myView.transform;
transform = CGAffineTransformRotate(transform, sender.rotation);
self.myView.transform = transform;
} //复位
sender.rotation = ;
}
演示结果:(旋转了)

//四、pan拖动的手势
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(pan:)]; //需要手指数
pan.minimumNumberOfTouches = ;
pan.maximumNumberOfTouches = ; [self.view addGestureRecognizer:pan];
//pan手势识别的处理方法
-(void)pan:(UIPanGestureRecognizer *)sender
{
//持续性操作
if (sender.state == UIGestureRecognizerStateChanged)
{
CGPoint offsetPoint = [sender translationInView:self.view];
CGPoint center = self.myView.center;
self.myView.center = CGPointMake(center.x+offsetPoint.x, center.y+offsetPoint.y);
} //复位
[sender setTranslation:CGPointZero inView:self.view];
}
演示结果:(从中间拖到了右下角)

//五、longPress长按手势
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPress:)]; //需要按的次数
longPress.numberOfTapsRequired = ;
//需要几根手指
longPress.numberOfTouchesRequired = ;
//按住的最小时间
longPress.minimumPressDuration = 0.2f; [self.myView addGestureRecognizer:longPress];
//longPress手势识别的处理方法
-(void)longPress:(UILongPressGestureRecognizer *)sender
{
//持续性操作
if (sender.state == UIGestureRecognizerStateChanged)
{
self.myView.backgroundColor = [UIColor yellowColor];
}
else if (sender.state == UIGestureRecognizerStateEnded)
{
self.myView.backgroundColor = [UIColor redColor];
} }
演示结果:(长按时间到,红色变为黄色)

//六、swipe轻扫手势
UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipe:)]; //设置手势轻扫方向
swipe.direction = UISwipeGestureRecognizerDirectionUp; [self.view addGestureRecognizer:swipe];
//swipe手势识别的处理方法
-(void)swipe:(UISwipeGestureRecognizer *)sender
{
if (sender.direction == UISwipeGestureRecognizerDirectionRight)
{
NSLog(@"swipe Right");
}
else if (sender.direction == UISwipeGestureRecognizerDirectionLeft)
{
NSLog(@"swipe Left");
}
else if (sender.direction == UISwipeGestureRecognizerDirectionDown)
{
NSLog(@"swipe Down");
}
else if (sender.direction == UISwipeGestureRecognizerDirectionUp)
{
NSLog(@"swipe Up");
}
}
@end
演示结果:(只有向上扫,才输出结果)
-- ::27.818 -手势识别gestureReconizer[:] swipe Up
<7>摇动手势
重写方法:
-(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
if (event.subtype == UIEventSubtypeMotionShake)
{
NSLog(@"摇一摇,摇到外婆桥");
}
}
运行结果:
-- ::35.757 -shake[:] 摇一摇,摇到外婆桥
摇动手势操作方法,点击硬件设备上的如下Shake Gesture按钮即可:

iOS:手势的详解UIGestureReconizer的更多相关文章
- iOS应用开发详解
<iOS应用开发详解> 基本信息 作者: 郭宏志 出版社:电子工业出版社 ISBN:9787121207075 上架时间:2013-6-28 出版日期:2013 年7月 开本:16开 ...
- 转载]IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本 )
原文地址:IOS LBS功能详解[0](获取经纬度)[1](获取当前地理位置文本作者:佐佐木小次郎 因为最近项目上要用有关LBS的功能.于是我便做一下预研. 一般说来LBS功能一般分为两块:一块是地理 ...
- iOS中-Qutarz2D详解及使用
在iOS中Qutarz2D 详解及使用 (一)初识 介绍 Quartz 2D是二维绘图引擎. 能完成的工作有: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成 ...
- iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)
前言:一个路径可以包含由一个或者多个shape以及子路径subpath,quartz提供了很多方便的shape可以直接调用.例如:point,line,Arc(圆弧),Curves(曲线),Ellip ...
- iOS开发——Block详解
iOS开发--Block详解 1. Block是什么 代码块 匿名函数 闭包--能够读取其他函数内部变量的函数 函数变量 实现基于指针和函数指针 实现回调的机制 Block是一个非常有特色的语法,它可 ...
- iOS开发:详解Objective-C runTime
Objective-C总Runtime的那点事儿(一)消息机制 最近在找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题.当然还有一些其他问题也几乎 ...
- 了解iOS消息推送一文就够:史上最全iOS Push技术详解
本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表. 1.引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ.微信等IM界面处于前台时,聊天消息和指 ...
- iOS开发者证书-详解
iOS开发者证书-详解/生成/使用 本文假设你已经有一些基本的Xcode开发经验, 并注册了iOS开发者账号. 相关基础 加密算法 现代密码学中, 主要有两种加密算法: 对称密钥加密 和 公开密钥加密 ...
- iOS开发-Runtime详解
iOS开发-Runtime详解 简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的.比如: [recei ...
随机推荐
- Django web框架之权限管理二
1. login登录 def login(request): if request.method=="GET": return render(request,'login.html ...
- 4.Spark Streaming事务处理
首先,我们必须知道什么是事务及其一致性? 事务应该具有4个属性:原子性.一致性.隔离性.持久性.这四个属性通常称为ACID特性. 原子性(atomicity).一个事务是一个不可分割的工作单位,事务中 ...
- 如何学习Docker
如何学习Docker 学习Docker,如果没有云计算的基本知识,以及内核的基本知识,那么学习并理解起来会稍吃力.作为容器,Docker容器的优势在哪,不足在哪,最好了解容器的实现是怎样的(简单了解) ...
- 【转载】SwipeRefreshLayout源码解析
原文地址:https://github.com/hanks-zyh/SwipeRefreshLayout/blob/master/README.md 官方文档 SwipeRefreshLayout 是 ...
- (2)go 规范,变量,基本数据类型
.一.规范 main 函数为入口 严格区分大小写 不需要加分号 一行只写一条语句 定义的变量或者导入的包必须要用到,否则编译时会报错 左括号不能单独一行 逗号可以用来在换行时连接字符串 标识符由字母数 ...
- 洛谷——P1190 接水问题
P1190 接水问题 题目描述 学校里有一个水房,水房里一共装有 m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为 1. 现在有 n 名同学准备接水,他们的初始接水顺序已经确定.将这些同学 ...
- 连接LilyPad之Windows平台的驱动
连接LilyPad之Windows平台的驱动 LilyPad和其他的Arduino控制板的不同之处是它是为电子织物和可穿戴设计的.那么,它的大小就必须要紧凑.所以,它并没有板载其他大多数板子都具有的U ...
- Xamarin中Unsupported major.minor version 52.0问题解决
Xamarin中Unsupported major.minor version 52.0问题解决 出现这种问题,是由于所使用的Java代码使用Java 8所才具有的特性.这个时候,需要将JDK升级到J ...
- 【带权并查集】【离散化】vijos P1112 小胖的奇偶
每个区间拆成r和l-1两个端点,若之内有偶数个1,则这两个端点对应的前缀的奇偶性必须相同,否则必须相反. 于是可以用带权并查集维护,每个结点储存其与其父节点的奇偶性是否相同,并且在路径压缩以及Unio ...
- 【manacher】HDU3068-最长回文
[题目大意] 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. [manacher知识点] ①mx - i > P[j] 的时候,以S[j]为中心的回文子串 ...