UIGestureRecognizer触控手势
UIGestureRecognizer
一,概念
UIGestureRecognizer是一个抽象类(特殊的触摸事件),UIGestureRecognizer是一个父类,定义了所有手势操作的基本行为,使用它的子类可处理具体的手势,实际操作中常用的子类有以下几种
UITapGestureRecognizer | 轻触,点按手势 |
UISwipeGestureRecognizer | 轻扫手势 |
UILongPressGestureRecognizer | 长按手势 |
UIPanGestureRecognizer | 平移,拖拽手势 |
UIPinchGestureRecognizer | 捏合,缩放手势 |
UIRotationGestureRecognizer | 旋转手势 |
UIScreenEdgePanGestureRecognizer | 屏幕边缘手势 |
- 使用步骤
- da创建手势识别对象
- 设置手势识别属性,例如手指数量,方向等
- 将手势识别附加到指定的视图之上
- 编写手势触发监听方法
二,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触控手势相关推荐
- Linux的触屏手势软件安装,如何添加Mac的多点触控手势到Ubuntu | MOS86
虽然Mac操作系统有很多故障,易于使用是苹果在其他地方超越的主要地方.在Mac笔记本电脑上,由于macOS如何实现触摸板手势,因此用户可以期待出色的令人印象深刻的触摸板体验. On默认情况下Ubunt ...
- 【已解决】机械革命s1-01触控手势失效解决方案
0 背景 机械革命s1-01系统更新或者重装系统后可能会出现触控手势失效的情况.据了解,该型号出厂时的驱动版本较老,更新系统后会默认安装较新版本驱动,导致手势无法使用. 1 失败尝试 方法一:从官网下 ...
- Linux 设置多指触控手势,以 Manjaro 为例
Linux 设置多指触控手势,以 Manjaro 为例 date: 2020-09-5 lastmod: 2021-09-29 在 Plasma(KDE) 上借助 gestures.xdotool 设 ...
- android 多个手指同时点击,处理多点触控手势 | Android 开发者 | Android Developers...
多点触控手势是指多个指针(手指)同时轻触屏幕.这节课介绍了如何检测涉及多个指针的手势. 请参阅以下相关资源: 跟踪多个指针 当多个指针同时轻触屏幕时,系统会生成以下触摸事件: 您可以通过每个指针的索引 ...
- android 处理多点触控手势
编写:Andrwyw - 原文:http://developer.android.com/training/gestures/multi.html 多点触控手势是指在同一时间有多点(手指)触碰屏幕.本 ...
- 10_10_安卓加linux命令,Scrcpy 1.11版支持Android 10及多点触控手势,附Linux下安装命令...
Scrcpy 1.11版本增加了对Android 10的支持及多点触控手势,现在就可以在Linux系统下安装Scrcpy的更新版本,该工具可让你在PC上镜像Android手机. 更新说明 Scrcpy ...
- 触控手势怎么设计才好用(二)
二.触控手势的使用情景 情景指的是用户使用时的环境和状态--也就是任何可以影响用户跟设备进行交互的内容.由于这些情景持续并快速地变化,对移动设备而言就显得极其重要.我们要考虑用户的分心.多任务.手势操 ...
- vue 多点触控手势_手写 Vue 手势组件__Vue.js
前言 最近需要使用手指捏合扩大的手势操作,找了几个组件,要么对 Vue 适配不好,要么量级太大,决定自己手写手势操作. 项目与效果预览 思路 直接在 DOM 上绑定 touchstart .touch ...
- vue 多点触控手势_涨姿势了!Appium也可以多点触控操作
有头发且有趣的码农万里挑一~ 104 有料叔 | 一位有故事的程序猿 在网页中我们经常使用缩放操作来便利的查看具体的信息,在appium中使用MultiAction多点触控的类来实现 MultiAct ...
最新文章
- JAVAWEB项目--模拟考试系统需求(一)
- Ubuntu 16.04上搭建CDH5.16.1集群
- 我的世界java版tis,我的世界1.7.10~1.8.8 9tis-3d回到汇编的时代mod
- Linux 系统添加静态路由的方法
- n1怎么进入线刷模式_怎么用斐讯NI天天链刷机成电视机顶盒教程
- mysql唯一性约束冲突_如何解决逻辑删除与数据库唯一约束冲突
- pyrcc5和pyuic5.exe文件放在scripts文件夹下
- 已知平面上两点坐标及半径,求过两点圆弧的圆心坐标
- PHP 图片转PDF
- 数据过多/DOM操作导致页面卡顿和请求突增导致页面崩溃
- 6.CCS新建工程及配置
- Echarts炫酷配置
- 2022-2028全球粉尘检测仪行业调研及趋势分析报告
- Conflicting order. Following module has been added:
- ANSYS FLUENT瞬态模拟动画制作
- Apollo(阿波罗)(一)环境搭建
- 手把手教你最近很火的 微信公众号测试号推送消息
- linux 深度定制,基于ubuntu发行版的安装界面的深度定制过程
- 求:生意参谋 data 破解,最好是用php
- P5200 [USACO19JAN]Sleepy Cow Sorting G
热门文章
- Shifting Stacks【题解】
- XML格式文件转化为实体类Bean
- scheduled一分钟执行一次_Spring 中使用 @Scheduled 创建定时任务
- 什么原因导致芯片短路_PCB电路板短路的原因及解决方法-EDA/PCB-与非网
- Java枚举的打印_如何在java中打印所有枚举值?
- 【工厂扫码打印扫码装箱错误追溯系统】完整案例详解(PythonPyQt 源码Mysql数据库)
- 解密猫晚直播技术:如何保障全球200多个国家和地区同时在线狂欢?
- C# 重载 Equals() 方法、重载运算符、声明显隐式转换的简要整理
- android webview 横竖屏_Android 切换横竖屏
- 路由器有以下几种联网接口