UIGestureRecognizer

一,概念

UIGestureRecognizer是一个抽象类(特殊的触摸事件),UIGestureRecognizer是一个父类,定义了所有手势操作的基本行为,使用它的子类可处理具体的手势,实际操作中常用的子类有以下几种

UITapGestureRecognizer 轻触,点按手势
UISwipeGestureRecognizer 轻扫手势
UILongPressGestureRecognizer 长按手势
UIPanGestureRecognizer 平移,拖拽手势
UIPinchGestureRecognizer 捏合,缩放手势
UIRotationGestureRecognizer 旋转手势
UIScreenEdgePanGestureRecognizer 屏幕边缘手势
  • 使用步骤
  1. da创建手势识别对象
  2. 设置手势识别属性,例如手指数量,方向等
  3. 将手势识别附加到指定的视图之上
  4. 编写手势触发监听方法

二,UIView中方法

1,添加一个手势

-(void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer;

2,移除一个手势

 -(void)removeGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer;

3,是否接收一个手势触摸事件

-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;

三,UIGestureRecognizer的属性和方法

1)属性:

1,获取当前手势状态

@property(nonatomic, readonly)UIGestureRecognizerState state;

UIGestureRecognizerState枚举

typedef enum
{UIGestureRecognizerStatePossible,//尚未识别是何种手势操作(但可能已经触发了触摸事件),默认状态UIGestureRecognizerStateBegan,//手势已经开始,此时已经被识别,但这个过程中可能发生变化,手势操作尚未完成UIGestureRecognizerStateChanged,//手势状态发生改变UIGestureRecognizerStateEnded,//手势识别操作完成(此时已经松开手指)UIGestureRecognizerStateCancelled,//手势被取消,恢复到默认状态UIGestureRecognizerStateFailed,//手势识别失败,恢复到默认状态UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded;//手势识别完成,同end
}UIGestureRecognizerStateType;

2,手势识别是否可用

@property(nonatomic, getter = isEnable) BOOL enabled;

3,获取手势触摸的View视图

@property(nullable, nonatomic, readonly) UIView *view;

4,是否取消触摸控件的响应

      默认为YES,这种情况下当手势识别器识别到触摸之后,会发送touchesCancelled给触摸到的控件以取消控件view对touch的响应,此时只有手势识别器响应touch。

当设为NO时,手势识别器识别到触摸之后不会发送touchesCancelled给控件,此时手势识别器和控件view均响应touch。

@property(nonatomic) BOOL cancelsTouchesInView;

5,是否延迟发送触摸事件给触摸到的控件

      默认是NO,此情况下当发生一个触摸时,手势识别器先捕捉到触摸,然后发给触摸到的控件,两者各自做出响应。

      若设为YES,手势识别器在识别的过程中(注意是识别过程),不会将触摸发给触摸到的控件,即控件不会有任何触摸事件。只有在识别失败之后才会将触摸事件发给触        摸到的控件,此情况下控件view的响应会延迟约0.15ms。

@property(nonatomic) BOOL delaysTouchesBegan;

6,如果触摸识别失败是否立即结束本次手势识别的触摸事件(让触摸控件去识别触摸事件)

      默认为YES,这种情况下发生一个触摸时,在手势识别成功后,发送给touchesCancelled消息给触摸控件view,手势识别失败时,会延迟大概0.15ms,期间没有接收到别        的触摸才会发送touchesEnded触摸结束方法,

      当设为NO时,则不会延迟,即会立即发送touchesEnded以结束当前触摸。

@property(nonatomic) BOOL delaysTouchesEnded;

7, UIGestureRecognizerDelegate代理

@property(nullable, nonatomic, weak) id <UIGestureRecognizerDelegate> delegate;

2)方法:

1,创建一个手势对象并添加触发事件

-(instancetype)initWithTarget:(nullable id)target action:(nullable SEL)action;

2,给一个手势对象添加监听事件

-(void)addTarget:(id)target action:(SEL)action;

3,移除一个手势的监听事件

-(void)removeTarget:(nullable id)target action:(nullable SEL)action;

4,指定一个手势需要另一个手势执行失败才会执行,同时触发多个手势使用其中一个手势的解决办法,有时手势是相关联的。

       例如:单击和双击,点击和长按。点下去瞬间可能只会识别到单击无法识别其它。

       该方法可指定某一手势,即便自己已经满足条件了,也不会立刻触发,会等到该指定的手势确定失败后才触发

-(void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer;

       例子:关键在这一行,如果双击确定监测失败才会触发单击

[singleRecognizer requireGestureRecognizerToFail:doubleRecognizer];

5,获取当前触摸在指定视图上的点

-(CGPoint)locationInView:(nullable UIView*)view;

6,获取触摸手指数

-(NSUInteger)numberOfTouches;

7,多指触摸的触摸点相对于指定视图的位置

-(CGPoint)locationOfTouch:(NSUInteger)otherIndex inView:(nullable UIView*)view;

四,UIGestureRecognizerDelegate代理方法

处理一些同时进行的手势操作

1,开始进行手势识别时调用的方法。

返回NO则结束识别,不再触发手势。用处:可以在控件的指定位置使用手势识别

-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;

2,手指触摸屏幕后回调的方法

返回NO则不再进行手势识别,方法触发等。此方法在window对象在有触摸事件发生时,调用gesture recognizer的                    touchesBegan:withEvent:方法之前调用,如果返回NO,则gesture recognizer不会看到此触摸事件。(默认为YES)

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

例子 :UITapGestureRecognizer和UIButton的点击事件冲突的解决办法

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{if([touch.view isKindOfClass:[UIButton class]]){return NO;}return YES;
}

3,手指按压屏幕后回调的方法

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceivePress:(UIPress *)press;

4,是否支持多手势触发

返回YES,则可以多个手势一起触发方法.

返回NO则为互斥.

是否允许多个手势识别器共同识别,一个控件的手势识别后是否阻断手势识别继续向下传播,默认返回NO;

如果为YES,响应者链上层对象触发手势识别后,如果下层对象也添加了手势并成功识别也会继续执行,否则上层对象识          别后则不再继续传播.

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;

5,用来控制手势的互斥执行的两个方法

(1)此方法返回YES,第一个手势和第二个互斥时,第一个会失效

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;

(2)此方法返回YES,第一个手势和第二个互斥时,第二个会失效

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequireToFailureByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;

========================================================================

一,UITapGestureRecognizer轻拍手势

UITapGestureRecognizer是UIGestureRecognizer的子类

UITapGestureRecognizer继承UIGestureRecognizer的属性

class UITapGestureRecognizer : UIGestureRecognizer

属性:

       1,设置能识别到手势的轻触次数(默认为1)

@property (nonatomic) NSUInteger numberOfTapsRequired;

       2,设置能识别到手势的最少的手指的个数(默认为1)

@property (nonatomic) NSUInteger numberOfTouchesRequired;

创建手势

//创建手势,使用initWithTarget:action:的方法创建
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(方法名:)];

设置属性:UITapGestureRecognizer有两个属性

//设置轻拍次数
tap.numberOfTapRequired = 2;
//设置手指个数
tap.numberOfTouchesRequired = 2;

例子:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
tap.numberOfTapsRequired = 3;
tap.numberOfTouchesRequired = 2;
//把手势添加到对应的控件中
[self.imgView addGestureRecognizer:tap];

二,UISwipeGestureRecognizer轻扫手势

1,最少触摸次数,默认为1

@property (nonatomic) NSUInteger numberOfTouchesRequired;

2,设置轻扫手势支持的方向,默认为向右滑

@property (nonatomic) UISwipeGestureRecognizerDirection direction;
typedef enum
{UISwipeGestureRecognizerDirectionRight,//向右滑UISwipeGestureRecognizerDirectionLeft,//向左滑UISwipeGestureRecognizerDirectionUp,//向上滑UISwipeGestureRecognizerDirectionDown,//向下滑
}UISwipeGestureRecognizerType;

例子

UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeAction)];
swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
[self.imgView addGestureRecognizer:swipeLeft];

三,UILongPressGestureRecognizer长按手势

1,最少触摸次数,默认为0

@property (nonatomic) NSUInteger numberOfTapsRequired;

2,最少触摸手指个数,默认为1

@property (nonatomic) NSUInteger numberOfTouchesRequired;

3,设置能识别到长按手势的最短的长按时间,单位:秒,默认为0.5

@property (nonatomic) CFTimeInterval minimumPressDuration;

4,设置长按允许移动的最大距离,单位:像素,默认为10像素

@property (nonatomic) CGFloat allowableMovement;

例子:

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressAction:)];
longPress.minimumPressDuration = 0.5;
longPress.allowableMovement = 10;
[self.imgView addGestureRecognizer:longPress];

四,UIPanGestureRecognizer平移/拖拽手势

1、设置触发拖拽最少手指数,默认为1

@property (nonatomic) NSUInteger minimumNumberOfTouches;

2、设置触发拖拽最多手指数,默认为 UINT_MAX 无限大

@property (nonatomic) NSUInteger maximumNumberOfTouches;

3、获取当前拖拽位置

- (CGPoint)translationInView:(nullable UIView *)view;

4、设置当前拖拽位置

- (void)setTranslation:(CGPoint)translation inView:(nullable UIView *)view;

5、设置拖拽速度,单位:像素/秒

- (CGPoint)velocityInView:(nullable UIView *)view;

例子

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)];
[self.imgView addGestureRecognizer:pan];
// 拖拽手势的监听方法
- (void)panAction:(UIPanGestureRecognizer *)recognizer
{// 1. 获取手指拖拽的时候, 平移的值CGPoint translation = [recognizer translationInView:recognizer.view];// 2. 让当前控件做响应的平移recognizer.view.transform = CGAffineTransformTranslate(recognizer.view.transform, translation.x, translation.y);// 3. 每次平移手势识别完毕后, 让平移的值不要累加[recognizer setTranslation:CGPointZero inView:recognizer.view];
}

五,UIPinchGestureRecognizer捏合/缩放手势

1、设置缩放比例

@property (nonatomic) CGFloat scale;

2、获取捏合速度,单位:缩放比/秒

@property (nonatomic, readonly) CGFloat velocity;

例子

UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchAction:)];pinch.delegate = self;
[self.imgView addGestureRecognizer:pinch];
// 捏合手势监听方法
- (void)pinchAction:(UIPinchGestureRecognizer *)recognizer
{recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale);recognizer.scale = 1.0;
}

六,UIRotationGestureRecognizer旋转手势

1,旋转的角度

@property (nonatomic) CGFloat rotation;

2,旋转速度,单位:度/秒

@property (nonatomic, readonly) CGFloat velocity;

例子

//为图片添加一个旋转的手势
UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotateAction:)];
rotation.delegate = self;
[self.imgView addGestureRecognizer:rotation];
//旋转手势监听方法
-(void)rotateAction:(UIRotationGestureRecognizer *)recognizer
{//在原来的基础上,累加多少度recognizer.view.transform = CGAffineTransformRotate(recognizer.view.transform, recognizer.rotation);//每次旋转后将rotation置0。recognizer.rotation=0;
}

七,UIScreenEdgePanGestureRecognizer屏幕边缘手势

例子

UIScreenEdgePanGestureRecognizer *screenEdgePan = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(screenEdgePanAction:)];
//使用屏幕边界平移手势要注意两点//1,视图位置(屏幕边缘)//2,设置edges属性
//设置屏幕边缘手势支持方法
screenEdgePan.edges = UIRectEdgeLeft;
//属性设置
[_textView addGestureRecognizer:screenEdgePan];#pragma mark 屏幕边界平移事件
-(void)screenEdgePanAction:(UIScreenEdgePanGestureRecognizer *)sender
{//计算偏移量CGPoint point = [sender translationInView:_textView];//进行平移sender.view.transform = CGAffineTransformMakeTranslation(point.x, point.y);
}

UIGestureRecognizer触控手势相关推荐

  1. Linux的触屏手势软件安装,如何添加Mac的多点触控手势到Ubuntu | MOS86

    虽然Mac操作系统有很多故障,易于使用是苹果在其他地方超越的主要地方.在Mac笔记本电脑上,由于macOS如何实现触摸板手势,因此用户可以期待出色的令人印象深刻的触摸板体验. On默认情况下Ubunt ...

  2. 【已解决】机械革命s1-01触控手势失效解决方案

    0 背景 机械革命s1-01系统更新或者重装系统后可能会出现触控手势失效的情况.据了解,该型号出厂时的驱动版本较老,更新系统后会默认安装较新版本驱动,导致手势无法使用. 1 失败尝试 方法一:从官网下 ...

  3. Linux 设置多指触控手势,以 Manjaro 为例

    Linux 设置多指触控手势,以 Manjaro 为例 date: 2020-09-5 lastmod: 2021-09-29 在 Plasma(KDE) 上借助 gestures.xdotool 设 ...

  4. android 多个手指同时点击,处理多点触控手势  |  Android 开发者  |  Android Developers...

    多点触控手势是指多个指针(手指)同时轻触屏幕.这节课介绍了如何检测涉及多个指针的手势. 请参阅以下相关资源: 跟踪多个指针 当多个指针同时轻触屏幕时,系统会生成以下触摸事件: 您可以通过每个指针的索引 ...

  5. android 处理多点触控手势

    编写:Andrwyw - 原文:http://developer.android.com/training/gestures/multi.html 多点触控手势是指在同一时间有多点(手指)触碰屏幕.本 ...

  6. 10_10_安卓加linux命令,Scrcpy 1.11版支持Android 10及多点触控手势,附Linux下安装命令...

    Scrcpy 1.11版本增加了对Android 10的支持及多点触控手势,现在就可以在Linux系统下安装Scrcpy的更新版本,该工具可让你在PC上镜像Android手机. 更新说明 Scrcpy ...

  7. 触控手势怎么设计才好用(二)

    二.触控手势的使用情景 情景指的是用户使用时的环境和状态--也就是任何可以影响用户跟设备进行交互的内容.由于这些情景持续并快速地变化,对移动设备而言就显得极其重要.我们要考虑用户的分心.多任务.手势操 ...

  8. vue 多点触控手势_手写 Vue 手势组件__Vue.js

    前言 最近需要使用手指捏合扩大的手势操作,找了几个组件,要么对 Vue 适配不好,要么量级太大,决定自己手写手势操作. 项目与效果预览 思路 直接在 DOM 上绑定 touchstart .touch ...

  9. vue 多点触控手势_涨姿势了!Appium也可以多点触控操作

    有头发且有趣的码农万里挑一~ 104 有料叔 | 一位有故事的程序猿 在网页中我们经常使用缩放操作来便利的查看具体的信息,在appium中使用MultiAction多点触控的类来实现 MultiAct ...

最新文章

  1. JAVAWEB项目--模拟考试系统需求(一)
  2. Ubuntu 16.04上搭建CDH5.16.1集群
  3. 我的世界java版tis,我的世界1.7.10~1.8.8 9tis-3d回到汇编的时代mod
  4. Linux 系统添加静态路由的方法
  5. n1怎么进入线刷模式_怎么用斐讯NI天天链刷机成电视机顶盒教程
  6. mysql唯一性约束冲突_如何解决逻辑删除与数据库唯一约束冲突
  7. pyrcc5和pyuic5.exe文件放在scripts文件夹下
  8. 已知平面上两点坐标及半径,求过两点圆弧的圆心坐标
  9. PHP 图片转PDF
  10. 数据过多/DOM操作导致页面卡顿和请求突增导致页面崩溃
  11. 6.CCS新建工程及配置
  12. Echarts炫酷配置
  13. 2022-2028全球粉尘检测仪行业调研及趋势分析报告
  14. Conflicting order. Following module has been added:
  15. ANSYS FLUENT瞬态模拟动画制作
  16. Apollo(阿波罗)(一)环境搭建
  17. 手把手教你最近很火的 微信公众号测试号推送消息
  18. linux 深度定制,基于ubuntu发行版的安装界面的深度定制过程
  19. 求:生意参谋 data 破解,最好是用php
  20. P5200 [USACO19JAN]Sleepy Cow Sorting G

热门文章

  1. Shifting Stacks【题解】
  2. XML格式文件转化为实体类Bean
  3. scheduled一分钟执行一次_Spring 中使用 @Scheduled 创建定时任务
  4. 什么原因导致芯片短路_PCB电路板短路的原因及解决方法-EDA/PCB-与非网
  5. Java枚举的打印_如何在java中打印所有枚举值?
  6. 【工厂扫码打印扫码装箱错误追溯系统】完整案例详解(PythonPyQt 源码Mysql数据库)
  7. 解密猫晚直播技术:如何保障全球200多个国家和地区同时在线狂欢?
  8. C# 重载 Equals() 方法、重载运算符、声明显隐式转换的简要整理
  9. android webview 横竖屏_Android 切换横竖屏
  10. 路由器有以下几种联网接口