事件处理

⼀、事件的基本概念
  • 事件  是当⽤户⼿指触击屏幕及在屏幕上移动时,系统不断 发送给应⽤程序的  对象。
  • 系统将事件按照特定的路径传递给可以对其进⾏处理的对 象。
  • 在iOS中,⼀个UITouch对象表⽰⼀个触摸,⼀个UIEvent 对象表⽰⼀个事件。事件对象中包含与当前多点触摸序列 相对应的所有触摸对象,还可以提供与特定视图或窗⼝相 关联的触摸对象。
  • 事件类型:触摸事件、晃动事件、远程事件
⼆、触摸的基本概念
在给定的触摸阶段中,如果发⽣新的触摸动作或已有的触摸动作发⽣ 变化,应⽤程序就会发送这些消息:
当⼀个或多个⼿指触碰屏幕时,发送touchesBegan:withEvent:消息。
当⼀个或多个⼿指在屏幕上移动时,发送touchesMoved:withEvent:消 息。
当⼀个或多个⼿指离开屏幕时,发送touchesEnded:withEvent:消息。
三、响应者链
  • 响应者链是⼀个响应者对象的连接序列,事件或动作消息 (或菜单编辑消息)依次传递。它允许响应者对象把事件 处理的职责转交给其它更⾼层的对象。应⽤程序通过向上 传递⼀个事件来查找合适的处理对象。因为点击检测视图 也是⼀个响应者对象,应⽤程序在处理触摸事件时也可以 利⽤响应链。 
  • 由多个响应者对象组成的链。
  • iOS中所有能响应事件(触摸、晃动、远程事件)的对象 都是响应者。 
  • 系统定义了⼀个抽象的⽗类UIResponder来表⽰响应者。 其⼦类都是响应者。
检测碰撞视图
硬件检测到触摸操作,会将信息交给UIApplication,开始检测。
UIApplication -> window -> viewController -> view -> 检测所有⼦ 视图
最终确认触碰位置,完成响应者链的查询过程。
处理触摸事件
检测到响应者后,实现touchesBegan:withEvent:等⽅法,即处理事 件。
如果响应者没有处理事件,事件会向下传递。如果没有响应者处理, 则丢弃触摸事件。
事件处理的顺序与触摸检测查询相反。
触摸的⼦视图 -> view -> viewController -> window -> UIApplication
阻断响应者链
响应者链可以被打断。⽆法完成检测查询过程。
视图类的属性 : userInteractionEnabled。关闭后能阻断查询过 程。
响应者链处理原则
点击检测视图或者第⼀响应者传递事件或动作消息给它的视图控制器(如 果它有的话);如果没有⼀个视图控制器,就传递给它的⽗视图。 
如果⼀个视图或者它的视图控制器不能处理这个事件或动作消息,它将 传递给该视图的⽗视图。
在这个视图层次中的每个后续的⽗视图遵循上述的模式,如果它不能处 理这个事件或动作消息的话。
最顶层的视图如果不能处理这个事件或动作消息,就传递给UIWindow对 象来处理。
如果UIWindow 对象不能处理,就传给单件应⽤程序对象UIApplication 如果应⽤程序对象也不能处理这个事件或动作消息,将抛弃它。
//打开用户交互
    imageView.userInteractionEnabled = YES;
    //响应者链阻断之后,完成不了检测过程。检测过程完成不了,所以事件就触发不了。
    //而控件阻断响应者链就是关闭用户交互,默认关闭用户交互的控件有UIImageView和UILabel.
//以后的项目开发中,如果想让UIImageView和UILabel响应事件,必须将其交互打开
//触摸的三个时间阶段的方法
//触摸开始的方法
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"%s %d",__FUNCTION__, __LINE__);
    self.backgroundColor = [UIColor colorWithRed:arc4random() % 256 / 255.0 green:arc4random() % 256 / 255.0 blue:arc4random() % 256 / 255.0 alpha:1.0];
    /*
    //记录屏幕的宽和高
    CGFloat screenWidth = [[UIScreen mainScreen] bounds].size.width;
    CGFloat screenHeight = [[UIScreen mainScreen] bounds].size.height;
   
    int minX = (int)(self.frame.size.width / 2);
    int maxX = (int)(screenWidth) - minX;
   
    int minY = (int)(self.frame.size.height / 2);
    int maxY = (int)(screenHeight) - minY;
   
    CGPoint newCenter = CGPointMake(0, 0);
    newCenter.x = arc4random() % (maxX - minX + 1) + minX;
    newCenter.y = arc4random() % (maxY - minY + 1) + minY;
    self.center = newCenter;*/
}

//触摸移动的方法
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"%s %d",__FUNCTION__, __LINE__);
    self.backgroundColor = [UIColor colorWithRed:arc4random() % 256 / 255.0 green:arc4random() % 256 / 255.0 blue:arc4random() % 256 / 255.0 alpha:1.0];
   
    //获取触摸在屏幕上的手指对象
    UITouch *touch = [touches anyObject];
   
    //获取手指之前的屏幕上的位置
    CGPoint previousP = [touch previousLocationInView:self];
   
    //获取手指现在的屏幕上的位置
    CGPoint currentP = [touch locationInView:self];
   
    CGPoint newCenter = CGPointMake(0, 0);
    newCenter.x = self.center.x + (currentP.x - previousP.x);
    newCenter.y = self.center.y + (currentP.y - previousP.y);
    self.center = newCenter;
}

//触摸结束的方法
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"%s %d",__FUNCTION__, __LINE__);
}

转载于:https://www.cnblogs.com/Walking-Jin/p/5210812.html

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

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

相关文章

pytorch查看打印网络参数总个数

print("Total number of paramerters in networks is {} ".format(sum(x.numel() for x in net.parameters())))其中net是代码中的网络模型

OpenCV学习笔记(十):图像金字塔Pyramid和图像缩放:pyrDown(),pyrUp(),resize()

OpenCV学习笔记(十):图像金字塔Pyramid和图像缩放:pyrDown(),pyrUp(),resize() 一、图像金字塔定义: 图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的…

php分享二十四:数组

1:isset() 对于数组中为 NULL 的值不会返回 TRUE,而 array_key_exists() 会。 2:利用array_filter和strlen快速过滤数组中等于0的值 $path str_replace(array(/, \\), DIRECTORY_SEPARATOR, $path); $parts array_filter(explode(DIRECTORY…

量子纠缠和宇宙黑洞

2019年7月,量子纠缠(两个光子)照片首次公布2019年4月,宇宙黑洞(质量为太阳的65亿倍)照片首次公布来源:吴志刚科学网博客量子纠缠和宇宙黑洞,一个极小,一个极大&#xff0…

pytorch的F.cross_entropy交叉熵函数

F.cross_entropy计算交叉熵损失,代码为: lossF.cross_entropy(out, y) 其中out是网络输出的概率向量,y是真实标签,注意y是标量。使用这个函数时应该特别注意out是没有经过softmax处理过的。因为调用F.cross_entropy函数时会通过…

QT学习笔记(十六):setwindowflags的属性总结

QT学习笔记(十六):setwindowflags的属性总结 此枚举类型用于为小部件指定各种窗口系统属性。它们是不常用的,但在一些情况下是必要的。其中一些标志取决于底层窗口管理器是否支持它们。 主要类型有 enum WindowType {Widget 0x…

1143 多少个Fibonacci数

1143 多少个Fibonacci数 时间限制:500MS 内存限制:65536K 提交次数:270 通过次数:16 题型: 编程题 语言: G;GCC Description 给你如下Fibonacci 数的定义: F1 1 F2 2 Fn Fn-1 Fn-2 (n > 3) 给你两个数a与b,现要求你计算在a与b之间&…

这些重大科技领域问题,听听专家怎么说

来源:科技日报从前不久结束的全英华人教授协会年会上了解到,目前人类面临的许多问题都可以通过扎实的科研创新和精准的技术应用予以解决;新的技术领域的出现,不代表传统技术方法都要丢弃;尽管摆在广大科技从业者面前的…

plt.fill_between用法

plt.fill_between用颜色填充两条曲线之间的区域plt.fill_between(x, y1, y2),其中x是横坐标,y1和y2是两条曲线,这个函数的作用是用颜色填充y1和y2这两条曲线之间的区域。 该函数最常用的用法是已知均值曲线和标准差,画出标准差覆…

QT+OpenCV综合示例:载入、读取图片

QTOpenCV综合示例:载入、读取图片1、代码:2、运行结果:下载1 GitHub: 下载2 1、代码: 1)opencv_imwrite_Q.pro 添加: INCLUDEPATH D:\opencv-3.1.0\opencv\build\includewin32:CONFIG(release, debug|re…

swift inheritace 继承

class Base {var base_x 0static var base_y 1final var base_z 12func baseInc() {base_x 1}class func baseMuti() {base_y - 1} }class Parent {func parentInc() {print("parnetInc")} }class Child: Base {//属性也加overrideoverride var base_x: Int {wi…

“算法战:DARPA下一代人工智能计划初见成效” 背景分析与初步研判

2018年9月,美国国防高级研究计划局(DARPA)宣布将出资20亿美元,用于开发新的人工智能技术。近日,DARPA副局长彼得海纳姆在华盛顿接受记者采访时说,DARPA的“下一代人工智能”(AI Next)计划在实施…

python画PR曲线(precision-recall曲线)

使用python画precision-recall曲线的代码是: sklearn.metrics.precision_recall_curve(y_true, probas_pred, pos_labelNone, sample_weightNone) 以上代码会根据预测值和真实值,并通过改变判定阈值来计算一条precision-recall典线。 注意&#xff1a…

OpenCV学习笔记(十一):阈值化:threshold(),adaptivethreshold()

OpenCV学习笔记(十一):阈值化:threshold(),adaptivethreshold() 一、定义: 1)固定阈值操作 double threshold( InputArray src, // 输入图像,单通道 OutputArray dst, // 输出图像 double…

北京邮电大学刘伟教授:人机融合与混合智能的新应用场景

前言:本文是北京邮电大学人机交互与认知工程实验室主任、科技委人机融合智能组首席科学家刘伟教授就混合智能的产生、起源和新应用场景所做的深度阐述。第一部分是刘伟老师从新书《崛起的超级智能:互联网大脑如何影响科技未来》延伸的关于人机融合的思考…

VC++6.0怎么打开工程

点击文件→打开,选择工程所在文件夹,选择后缀名为dsp的文件打开即可。 若直接选择cpp后缀名打开,打开的只是cpp文件,而不是工程,此时VC右侧不会显示工程信息。

问题解决:QtCreator屏蔽指定警告:如C4819等

QT creator 频繁报出 ,不好解决的错误如: warning: C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 方法一:(屏蔽此警告) 在工程文件.pro里面添加 # disable C…

解析|2G~5G与未来天线技术!

来源:电子万花筒过去二十年,我们见证了移动通信从1G到4G LTE的转变。在这期间,通信的关键技术在发生变化,处理的信息量成倍增长。而天线,是实现这一跨越式提升不可或缺的组件。按照业界的定义,天线是一种变…

DB2 错误代码 命令大全

SQLSTATE 消息 本节列示 SQLSTATE 及其含义。SQLSTATE 是按类代码进行分组的;对于子代码,请参阅相应的表。 表 2. SQLSTATE 类代码 类 代码 含义 要获得子代码, 参阅... 00 完全成功完成 表 3 01 警告 表 4 02 无数据 表 5 07 动态 …

C++查看各种数据类型所占字节和最大最小值(数据范围)

#include<iostream> using namespace std; int main() { cout << "bool: \t\t" << "所占字节数&#xff1a;" << sizeof(bool); cout << "\t最大值&#xff1a;" << (numeric_limits<bool>::ma…