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,返回最合适的view
UIView *fitView = [super hitTest:point withEvent:event]; return fitView;
}

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

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

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

【原】iOS学习之事件处理的原理的更多相关文章

  1. iOS学习之事件处理

    一.事件的基本概念      1.事件概述 事件是当用户手指触击屏幕及在屏幕上移动时,系统不断发送给应用程序的对象. 系统将事件按照特定的路径传递给可以对其进行处理的对象. 在iOS汇总,一个UITo ...

  2. 原 iOS深入学习(Block全面分析)http://my.oschina.net/leejan97/blog/268536

    原 iOS深入学习(Block全面分析) 发表于1年前(2014-05-24 16:45)   阅读(26949) | 评论(14) 39人收藏此文章, 我要收藏 赞21 12月12日北京OSC源创会 ...

  3. 并发编程学习笔记(4)----jdk5中提供的原子类及Lock使用及原理

    (1)jdk中原子类的使用: jdk5中提供了很多原子类,它会使变量的操作变成原子性的. 原子性:原子性指的是一个操作是不可中断的,即使是在多个线程一起操作的情况下,一个操作一旦开始,就不会被其他线程 ...

  4. 【原】iOS学习47之第三方-FMDB

    将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法) 1. FMDB ...

  5. 【原】iOS学习之第三方-AFNetworking1.3.0

    将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 AFNetworking 第三方集成到工程中,具体请看上篇博客iOS学习46之第三方CocoaPods的安装和使用(通用方 ...

  6. 【原】iOS学习之SQLite和CoreData数据库的比较

    1. SQLite数据库 sqlite数据库操作的基本流程是, 创建数据库, 再通过定义一些字段来定义表格结构, 可以利用sql语句向表格中插入记录, 删除记录, 修改记录, 表格之间也可以建立联系. ...

  7. 2015最新iOS学习线路图

    iOS是由苹果公司开发的移动操作系统,以xcode为主要开发工具,具有简单易用的界面.令人惊叹的功能,以及超强的稳定性,已经成为iPhone.iPad 和iPod touch 的强大基础:iOS 内置 ...

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

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

  9. iOS学习路线图

    一.iOS学习路线图   二.iOS学习路线图--视频篇       阶 段 学完后目标 知识点 配套学习资源(笔记+源码+PPT) 密码 基础阶段 学习周期:24天       学习后目标:    ...

随机推荐

  1. Yii2 认证实现原理和示例

    Yii的用户认证分为两个部分,一个是User组件,负责管理用户认证状态的,包括登录,登出,检测当前登录状态等,源文件位于vender/yiisoft/yii2/web/User.php.另一个是实现接 ...

  2. 深度学习笔记——PCA原理与数学推倒详解

    PCA目的:这里举个例子,如果假设我有m个点,{x(1),...,x(m)},那么我要将它们存在我的内存中,或者要对着m个点进行一次机器学习,但是这m个点的维度太大了,如果要进行机器学习的话参数太多, ...

  3. zepto之tap事件点透问题分析及解决方案

    点透现象出现的场景: 当A/B两个层上下z轴重叠,上层的A点击后消失或移开(这一点很重要),并且B元素本身有默认click事件(如a标签)或绑定了click事件.在这种情况下,点击A/B重叠的部分,就 ...

  4. 为什么要用base64编码

    1.需求 了解为什么要使用base64对数据编码 2.理由 因为传输二进制数据的时候,网络中间的有些路由会把ascii码中的不可见字符删了,导致数据不一致.一般也会对url进行base64编码 Whe ...

  5. 常用js函数封装

    see them... // 获取网址的get参数 var GET = function(name) { var reg = new RegExp("(^|&)" + na ...

  6. appium for hybrid app 处理webview

    之前研究了一段时间的appium for native app 相应的总结如下:                                            appium测试环境搭建 :ht ...

  7. Android selecter背景选择器使用

    android:drawable这个属性是必须的,默认时的背景图片. android:state_pressed布尔值.true指当用户点击或者触摸该控件的状态.默认为false android:st ...

  8. sh 自动化安装配置FTP服务器

    #!/bin/bash # FPATH=/etc/vsftpd/ FILE=/etc/vsftpd/vsftpd.conf USERB=ftp01 CON() { sed -i "s#ano ...

  9. IE8下String的Trim()方法失效的解决方案

    简洁方便 用jquery的trim()方法,$.trim(str)就可以了.

  10. Android 自定义ToolBar详细使用

    自定义xml设置ToolBar,通过menu文件扩展选项,通过继承baseactivity使用 1.ToolBar布局 <?xml version="1.0" encodin ...