【iOS】--手势操作

news2024/11/15 21:24:17

文章目录

    • UIGestureRecognizer 的继承关系:
  • 使用手势步骤
  • UIPanGestureRecognizer(拖动)
  • UIPinchGestureRecognizer(拖动)
  • UIRotationGestureRecognizer(旋转)
  • UITapGestureRecognizer(点按)
  • UILongPressGestureRecognizer(长按)
  • UISwipeGestureRecognizer(轻扫)
  • 手势操作状态


  • UIPanGestureRecognizer(拖动)
  • UIPinchGestureRecognizer(捏合)
  • UIRotationGestureRecognizer(旋转)
  • UITapGestureRecognizer(点按)
  • UILongPressGestureRecognizer(长按)
  • UISwipeGestureRecognizer(轻扫)

UIGestureRecognizer 的继承关系:

在这里插入图片描述

使用手势步骤

使用手势很简单,分为三步:

创建手势识别器对象实例。创建时,指定一个回调方法,当手势开始,改变、或结束时,执行回调方法。
设置手势识别器对象实例的相关属性(可选)。
添加到需要识别的 View 中。每个手势只对应一个 View,当屏幕触摸在 View 的边界内时,如果手势和预定的一样,那就会执行回调方法。
注意:一个手势只能对应一个 View,但是一个 View 可以有多个手势。

UIPanGestureRecognizer(拖动)

UILabel* lab = [[UILabel alloc] init];
    lab.frame = CGRectMake(100, 100, 100, 100);
    lab.backgroundColor = [UIColor redColor];
    [self.view addSubview:lab];
    lab.userInteractionEnabled = YES;

    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(press)];
    [lab addGestureRecognizer:pan];




- (void)press {
    NSLog(@"11111");
}

请添加图片描述

UIPinchGestureRecognizer(拖动)

- (void)viewDidLoad {
    [super viewDidLoad];
    UILabel* lab = [[UILabel alloc] init];
    lab.frame = CGRectMake(100, 100, 100, 100);
    lab.backgroundColor = [UIColor redColor];
    [self.view addSubview:lab];
    lab.userInteractionEnabled = YES;

    UIPinchGestureRecognizer *pan = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(press)];
    [lab addGestureRecognizer:pan];
}
- (void)press {
    NSLog(@"11111");
}

UIRotationGestureRecognizer(旋转)

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    UILabel* lab = [[UILabel alloc] init];
    lab.frame = CGRectMake(100, 100, 100, 100);
    lab.backgroundColor = [UIColor redColor];
    [self.view addSubview:lab];
    lab.userInteractionEnabled = YES;

    UIRotationGestureRecognizer *pan = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(press)];
    [lab addGestureRecognizer:pan];
}
- (void)press {
    NSLog(@"11111");
}

UITapGestureRecognizer(点按)

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    UILabel* lab = [[UILabel alloc] init];
    lab.frame = CGRectMake(100, 100, 100, 100);
    lab.backgroundColor = [UIColor redColor];
    [self.view addSubview:lab];
    lab.userInteractionEnabled = YES;

    UITapGestureRecognizer *pan = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(press)];
    [lab addGestureRecognizer:pan];
}
- (void)press {
    NSLog(@"11111");
}

请添加图片描述

UILongPressGestureRecognizer(长按)

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    UILabel* lab = [[UILabel alloc] init];
    lab.frame = CGRectMake(100, 100, 100, 100);
    lab.backgroundColor = [UIColor redColor];
    [self.view addSubview:lab];
    lab.userInteractionEnabled = YES;

    UILongPressGestureRecognizer *pan = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(press)];
    [lab addGestureRecognizer:pan];
}
- (void)press {
    NSLog(@"11111");
}

请添加图片描述

UISwipeGestureRecognizer(轻扫)


@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    UILabel* lab = [[UILabel alloc] init];
    lab.frame = CGRectMake(100, 100, 100, 100);
    lab.backgroundColor = [UIColor redColor];
    [self.view addSubview:lab];
    lab.userInteractionEnabled = YES;

    UISwipeGestureRecognizer *pan = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(press)];
    [lab addGestureRecognizer:pan];
}
- (void)press {
    NSLog(@"11111");
}

请添加图片描述

手势操作状态

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


在六种手势识别中,只有一种手势是离散型手势,就是 UITapGestureRecognizer(点按)。
离散型手势的特点:一旦识别就无法取消,而且只会调用一次手势操作事件(初始化手势时指定的回调方法)。

其他五种手势都是连续型手势。
连续型手势的特点:会多次调用手势操作事件,而且在连续手势识别后可以取消手势。
在这里插入图片描述
对于离散型手势 UITapGestureRecgnizer 要么被识别,要么失败,点按(假设点按次数设置为1,并且没有添加长按手势)下去一次不松开则此时什么也不会发生,松开手指立即识别并调用操作事件,并且状态为3(已完成)。

但是连续型手势要复杂一些,就拿旋转手势来说,如果两个手指点下去不做任何操作,此时并不能识别手势(因为我们还没旋转)但是其实已经触发了触摸开始事件,此时处于状态0;如果此时旋转会被识别,也就会调用对应的操作事件,同时状态变成1(手势开始),但是状态1只有一瞬间;紧接着状态变为2(因为我们的旋转需要持续一会),并且重复调用操作事件(如果在事件中打印状态会重复打印2);松开手指,此时状态变为3,并调用1次操作事件。

连续手势发生状态转换是由于触摸事件中的移动事件造成的,苹果官方的分析图也说明了这一点:在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/510073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈造纸配电室环境监控系统的应用案例

摘要:智能配电室环境监控系统可实现自动巡检、自动预警等功能,减少人员到现场巡视次数,能及早发现设备的潜在风险,迅速检测故障,节约维护保养时长,为配电生产检修、运行、各业务的标准化、规范化管理提供有…

【Flowable】Flowable候选人和候选人组

在流程定义中在任务结点的 assignee 固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn 文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差。针对这种情况可以给任务设置多个候选人或者候选人组,可以从候选…

IntelliJ IDEA编辑模板变量详解(Edit Template Variables)

函数描述annotated(“annotation qname”)使用驻留在指定位置的注释创建类型符号。 例如,请参见迭代组中的活动模板。anonymousSuper()为Kotlin对象表达式建议一个超类型。arrayVariable()建议当前作用域中适用的所有数组变量。 例如,请参见迭代组中的活…

ACM - DP习题集(word里面的一小部分题集)

DP 一、经典问题1、编辑距离2、扔鸡蛋问题3、整数背包4、最大独立集5、最长公共子序列6、最长公共递增子序列7、最长公共子串(ing)8、最长上升子序列9、最长回文子序列10、最长回文子串(ing)11、最长不重复子字符串(in…

OpenGL教程中矩阵Matrix的介绍

变换 原文Transformations作者JoeyDeVries翻译Django, Krasjet, BLumia校对暂未校对 尽管我们现在已经知道了如何创建一个物体、着色、加入纹理,给它们一些细节的表现,但因为它们都还是静态的物体,仍是不够有趣。我们可以尝试着在每一帧改变…

Python 操作 Excel,如何又快又好?

➤数据处理是 Python 的一大应用场景,而 Excel 则是最流行的数据处理软件。因此用 Python 进行数据相关的工作时,难免要和 Excel 打交道。Python处理Excel 常用的系列库有:xlrd、xlwt、xlutils、openpyxl ◈xlrd - 用于读取 Exce…

import一个“太极”库,让Python代码提速100倍!

众所周知,Python的简单和易读性是靠牺牲性能为代价的—— 尤其是在计算密集的情况下,比如多重for循环。 不过现在,大佬胡渊鸣说了: 只需import 一个叫做“Taichi”的库,就可以把代码速度提升100倍! 不信…

0-1规划在编程问题中的应用(UnityC#脚本/折返约瑟夫/OpenGL机器人摆臂循环)

一、0-1规划的定义 百度百科的解释:0-1规划是决策变量仅取值0或1的一类特殊的整数规划。在处理经济管理中某些规划问题时,若决策变量采用 0-1变量即逻辑变量,可把本来需要分别各种情况加以讨论的问题统一在一个问题中讨论。 如上面所说&…

记csdn打不开或打开缓慢后的修复--如何查找dns并修改hosts文件

记csdn打开缓慢后的修复–如何查找dns并修改hosts文件 问题: CSDN文章打开的十分缓慢,经常出现无法打开页面的错误提示 (以前用的好好的,现在不知道公司局域网改了什么东西,导致我的电脑打开CSDN经常缓慢好久&#x…

ACM - 其他算法 - 基础(前缀和 + 差分)

ACM- 其他算法 一、前缀和模板例题1、区间余数求K倍区间个数:AcWing 1230. K倍区间例题2、前缀和哈希求最长个数平分子串:Leetcode 面试题 17.05 字母与数字 二、差分1、一维差分2、二维差分 一、前缀和 模板 //一维前缀和 S[i] a[1] a[2] ... a[i] a[l] ... …

【行情速递】MLCC龙头涨价;车厂砍单芯片;台积电28nm设备订单全部取消!

导语:进入第二季度,MLCC龙头三环集团官宣涨价!风华高科紧随其后。车市价格战蔓延至芯片端,车厂开始砍单芯片,短短半年时间不到,车用芯片市场从价格飞涨和一片难求的背景,转为砍单与降价促销...更多详情请阅…

智能警示输出器在ESD系统中的作用

ESD(Electrostatic Discharge)是指静电放电,是一种电子元器件损坏的主要原因之一。在电子制造业中,ESD防静电系统是非常重要的,可以有效地保护电子元器件,避免因静电放电而造成的损坏和故障。而智能警示输出…

Spring事务(编程式事务声明式事务)

Spring中编程式事务的实现: 此方式包含了三个重要的操作:获取事务、提交事务、回滚事务。 以及依赖两个重要的对象:DataSourceTransactionManager、TransactionDefinition 使用编程式事务示例: RestController public class Use…

进程间通信都有哪些方法?

进程间通信是架构复杂系统的基石。复杂系统往往是分成各种子系统、子模块、微服务等等,按照 Unix 的设计哲学,系统的每个部分应该是稳定、独立、简单有效,而且强大的。系统本身各个模块就像人的器官,可以协同工作。而这个协同的枢…

后端常用的加密算法及hash运算

文章目录 基础知识1.加密三要素2.常用的两种加密方式⭐️3.凯撒密码 对称加密1. 编码概念2. DES — Data Encryption Standard3. 3DES — Triple-DES4. AES — Advanced Encryption Standard5. 分组密码模式6. 在golang中使用对称加密⭐️6.1 填充函数6.2 DESCBC API接口6.3 AE…

Git Clone 报错 `SSL certificate problem: unable to get local issuer certificate`

如果您在尝试克隆Git存储库时得到 “SSL certificate problem: unable to get local issuer certificate” 的错误,这意味着Git无法验证远程存储库的SSL证书。如果SSL证书是自签名的,或者SSL证书链有问题,就会发生这种情况。 $ git clone https://githu…

2021年上半年网络工程师真题详解(全套)

请点击↑关注、收藏,本博客免费为你获取精彩知识分享!有惊喜哟!! 1、以下关于RISC和CISC计算机的叙述中,正确的是( )。 A、RISC不采用流水线技术,CISC采用流水线技术 B、RISC使用…

若依框架AjaxResult改造适应Swagger接口文档

概述 若依框架后端使用的响应对象AjaxResult,和Swagger存在不兼容问题,导致返回体即使使用了Swagger注解,但是Swagger接口文档中,不显示返回体的对象Swagger文档: [外链图片转存失败,源站可能有防盗链机制,建议将图片…

【Linux】Linux入门学习之常用命令二

介绍 这里是小编成长之路的历程,也是小编的学习之路。希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。 一个人为什么要努力&a…

Flutter学习之旅 - 路由

文章目录 Flutter路由介绍普通路由普通路由传值 命名路由将routes的配置提到外面(使用的是Map)命名路由传值 路由跳转返回上一级路由替换路由返回到根路由返回Tabs后到指定页面 Flutter路由介绍 flutter中的路由通俗就是页面跳转。在Flutter中通过Navigator(学过reactjs或小程序…