在iOS学习23之事件处理中,小编详细的介绍了事件处理,在这里小编叙述一下它的相关原理

1、UITouch对象

在触摸事件的处理方法中都会有一个存放着UITouch对象的集合,这个参数有什么用呢?

(1)UITouch 对象的简介

  • 当用户用一根手指触摸屏幕时,会创建一个与手指相关联的 UITouch 对象

  • 一根手指对应一个 UITouch 对象

  • UITouch 的作用

  保存着根手指相关的信息,比如触摸的位置、时间、阶段

  • 当手指移动时,系统会更新同一个 UITouch 对象,使之能够一直保持该手指在的触摸位置

  • 当手指离开屏幕时,系统会销毁相应的 UITouch 对象

 提示:iPhone 开发中,要避免使用双击事件!

(2)UITouch 的属性

  • 触摸产生时所产生的窗口
@property (nonatomic, readonly, retain) UIWindow *window;

  • 触摸产生时所产生的视图
@property (nonatomic, readonly, retain) UIView *view;

  • 短时间内点按屏幕的次数,可以根据 tapCount 判断单击、双击或更多的点击
@property (nonatomic, readonly) NSUInteger tapCount; 

  • 记录了触摸事件产生或变化时的时间,单位是秒
@property (nonatomic, readonly) NSTimeInterval timestamp;

  • 当前触摸事件所处的状态
@property (nonatomic, readonly) UITouchPhase phase;

(3)UITouch 的方法

// 返回值表示触摸在View上的位置
- (CGPoint)locationInView:(UIView *)view;// 该方法记录了前一个触摸点的位置
- (CGPoint)previousLocationInView:(UIView *)view;

  • 方法一中返回的位置针对View的坐标系(以View的左上角为原点(0,0))

  • 当方法一调用时传入的View参数为 nil 的话,返回的是触摸点在 UIWindow 的位置

 实例代码:

// 当手指在view上移动的时候
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{NSLog(@"%s",__func__);// 获取UITouch对象UITouch *touch = [touches anyObject];// 获取当前点CGPoint curP = [touch locationInView:self];// 获取上一个点CGPoint preP = [touch previousLocationInView:self];// 获取x轴偏移量CGFloat offsetX = curP.x - preP.x;// 获取y轴偏移量CGFloat offsetY = curP.y - preP.y;// 修改view的位置(frame,center,transform)self.transform = CGAffineTransformTranslate(self.transform, offsetX, offsetY);//    self.transform = CGAffineTransformMakeTranslation(offsetX, 0);

}

  默认不支持多个手指,要修改 Multiple Touch 属性,在 storyboard 中将这个属性打钩就可以

2、原理

(1)事件的产生和传递

  • 发生触摸事件后,系统会将该事件加入到一个由 UIApplication 管理的事件队列中

  • UIApplication 会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口(keyWindow)

  • 主窗口会在视图层次结构中找到一个最适合的视图来处理触摸事件,这也是整个事件处理过程的第一步

  • 找到合适的视图控件后,就会调用视图控件的 touches 方法来做具体的事件处理

  touchesBegan...

  touchesMoved...

  touchesEnded...

(2)UIView不接收触摸事件的三种情况

  • 用户交互关闭
userInteractionEnabled = NO;

  • 视图隐藏
hidden = YES;

  • 透明
alpha = 0.0 ~ 0.1

(3)如何找到最适合的控件

  • 判断自己是否能接收触摸事件,底层实现方法:hitTest: withEvent:
// 作用:就是用来寻找最合适的view
// 什么时候调用:当事件传递给控件的时候,就会调用控件的这个方法,去寻找最合适的view
// point:当前的触摸点,point这个点的坐标系就是方法调用者
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{// 调用系统的做法去寻找最合适的view,返回最合适的viewUIView *fitView = [super hitTest:point withEvent:event];return fitView;
}

  该方法的返回值就是事件处理的视图控件

  当该方法在 UIWindow 类中重写,要使下图无论点哪里都是最底下白色的视图进行处理,就返回 self.subviews[0]。

  • 判断触摸点是否在自己身上,底层实现方法:pointInside: withEvent:
// 作用:判断当前这个点在不在方法调用者(控件)上
// 在判断是否是最适合的控件的时候调用
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{return YES;
}

  • 从后往前遍历子控件,重复前面的两个步骤

转载于:https://www.cnblogs.com/gfxxbk/p/5599070.html

【原】iOS学习之事件处理的原理相关推荐

  1. iOS -- 学习资料总结(转载)

    先著名转载地址:https://www.jianshu.com/p/c47c24ab1e76/ 关于iOS学习进阶的必读一些博客总结 经过一周的思考还是决定重组一下优秀的博客,首次整理这些博客比较乱, ...

  2. 关于iOS学习进阶的必读一些博客总结

    关于iOS学习进阶的必读一些博客总结 作者 Raybon_lee 2016.01.16 22:28* 字数 3110 经过一周的思考还是决定重组一下优秀的博客,首次整理这些博客比较乱,但是后期会慢慢增 ...

  3. iOS学习笔记-自己动手写RESideMenu

    代码地址如下: http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars ...

  4. ios学习 准备列表

    2019独角兽企业重金招聘Python工程师标准>>> Skip to content This repository Pull requests Issues Gist Watch ...

  5. ios学习--iphone开发笔记和技巧总结(原址持续更新)

    ios学习--iphone开发笔记和技巧总结(原址持续更新) 分类: ios Object-C2012-04-18 10:16 2716人阅读 评论(1) 收藏 举报 uiviewiphonelist ...

  6. iOS学习——核心动画之Layer基础

    iOS学习--核心动画之Layer基础 1.CALayer是什么? CALayer我们又称它叫做层.在每个UIView内部都有一个layer这样一个属性,UIView之所以能够显示,就是因为它里面有这 ...

  7. python爬虫原理-python学习之python爬虫原理

    原标题:python学习之python爬虫原理 今天我们要向大家详细解说python爬虫原理,什么是python爬虫,python爬虫工作的基本流程是什么等内容,希望对这正在进行python爬虫学习的 ...

  8. 原 iOS面试题收集

    原 iOS面试题收集 发表于2年前(2013-07-22 13:47)   阅读(369) | 评论(0) 4人收藏此文章, 我要收藏 赞0 听云性能监测产品App.Server.CDN免费试用,绑定 ...

  9. iOS学习笔记-自定义过渡动画

    代码地址如下: http://www.demodashi.com/demo/11678.html 这篇笔记翻译自raywenderlick网站的过渡动画的一篇文章,原文用的swift,由于考虑到swi ...

最新文章

  1. 五点讲述C++智能指针的点点滴滴
  2. KindEditor ASP.NET 上传/浏览服务器 附源码
  3. PyQt5 技术篇-设置QComboBox下拉框默认值,获取下拉框当前选择的内容
  4. Redis添加主节点
  5. github项目怎么运行_利用 GitHub 从零开始搭建一个博客
  6. XGBClassifier()特征选择
  7. extjs grid 整行变颜色_EXTJS根据值Value改变gridpanel单元格背景颜色或者设置整行字体颜色...
  8. Java正则表达式中的捕获组的概念及相关API使用
  9. SQL Server高级查询之常见数据库对象(数据库事务)第五章节
  10. Mysql中Drop,Truncate,Delete的区别
  11. java, android的aes等加密库
  12. 收获,不止oracle
  13. python安装模块错误怎么办_Python pip安装模块提示错误解决方案
  14. 用matlab2012制作机器人,利用matlab建立简单的机器人模型的步骤
  15. 程序员是做全栈工程师好?还是专注一个领域好?
  16. 超万支团队报名,历时4个月,阿里云原生编程挑战赛即将决出最后赢家
  17. 你追逐梦想之前听到的十种谎言
  18. 火狐浏览器的下载安装
  19. c语言中num =10,num/100%10 这是什么意思求详细的计算逻辑
  20. python敲七游戏代码_酒桌上的游戏

热门文章

  1. blf文件用什么软件打开_如何用皕杰流程创建一个blf演示流程文件?
  2. python3实用编程技巧_适合Python初学者的一些编程技巧
  3. wpf窗口向左向上_PaperWM:GNOME 下的平铺窗口管理
  4. Java学习总结:29
  5. Java项目:教务管理系统(java+JSP+Spring+SpringBoot+layui+maven)
  6. 【js】实现分页查询操作的步骤
  7. spark编程基础--2.3面向对象编程基础
  8. 五种常用的JavaScript自定义对象方式
  9. 4 RACMulticastConnection 连接类
  10. 理解 CSS 布局和块级格式上下文