一 > 事件的基本概念
  • 事件概述 : UIEvent  ( [ɪ’vent]事件  )  事件,是由硬件捕捉的一个表示用户操作设备的对象
  • 分三类 : 触摸事件 ,晃动事件 ,远程控制事件
  • 触摸事件 : 用户通过触摸设备屏幕操作对象 , 输入数据 ,支持多点触摸 ,包含1个到多个触摸点  最多支持11个点
  • 触摸事件的类型:  multitouch events : 多点触摸   ,, , accelerometer [ək,selə’rɒmɪtə]  events  : 加速度计的事件
      ..remote control events : 远程控制事件
     
二> 触摸的基本概念
  • UIView 支持触摸事件 ( 因为继承于UIResponder ) ,而且 支持多点触摸
  • 需要定义UIView 子类 ,实现触摸相关的方法
  • 方法由 touches …began 开始接触… ; touches..moved 触摸移动 ; touches ,,ended  触摸结束 ; touches ..canceled ( kan shou) 触摸取消 ;
方法的使用:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

    NSLog(@"开始触摸");
//控制view 的背景颜色 
    self.backgroundColor = [UIColor colorWithRed:MMM green:MMM blue:MMM alpha:1];
   
    // 一个手指
    UITouch *touch = [touches anyObject];
    //------> 需要定义一个变量 ,局部变量是不行的
    //手指在view上的点 (最开始的点)  (得到手指在view的位置: locationInView ,它返回的是CGPoint )
// 最开始的点
   _startPoint = [touch locationInView:self];

}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{

NSLog(@"开始移动");
    //先拿到一个点
    UITouch *touch = [touches anyObject];
    // 当前点 ------>
    CGPoint currentPoint = [touch locationInView:self];
    //拿到当前点的值减去 开始点的值 等于 偏移量
    CGFloat offSetX =currentPoint.x - _startPoint.x;
    CGFloat offSetY =currentPoint.y - _startPoint.y;
   
    CGPoint newCenter = self.center;
    newCenter.x = newCenter.x + offSetX;

    newCenter.y = newCenter.y + offSetY;
    // 将新的中心点给本身view 的中心点
    self.center = newCenter;
    self.backgroundColor = [UIColor colorWithRed:MMM green:MMM blue:MMM alpha:1];

}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{

NSLog(@"停止触摸");
}
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{

 
    NSLog(@“触摸取消");
 
}
————> 使用触摸是实现手势
  • 手势 : 有规律的触摸
  • UITouch 代表触摸在屏幕上的一根手指 .可以获取触摸时间和触摸位置
  • 如何获取touch对象 ,touches 集合中包含了视图上的所有手势
UIEvent : 事件,由硬件捕获到的一个表示用户操作设备的对象
事件分为三类: 触摸事件 ,晃动事件 ,远程控制事件
重点 :触摸事件,一个触摸事件包括一个或多个TUtouch 对象 (手指 )  iPhone最多支持11个点.

 

———>UIResponder : 响应者

  • 是可以响应事件并且可以对其进行处理的对象
  • UIResponder 是响应者的基类 ,UIApplication ,UIView 和 从UIView 派生出来的子类都是源自它
  • 第一响应者是当前正在接受事件的响应者对象
————>UITouch (手指 )
  • 表示触摸事件中的一个手指
  • UIView 支持触摸事件( 因为继承于 UIResponder  )  ,而且支持多点触摸
—————>想实现触摸必须实现这几个方法
 
 

————>触碰检测

  • 通过触碰检测找出Touch 发生在哪个视图上 ,递归检测多有的子视图,定位准确位置
 

二> 响应者链

  • 响应者链是有一个一个响应者组成的长链
  • 响应者链定义了ios中触摸事件的交互规则
  • 如果HIt - test 检测出的view 没有响应事件 ,事件就会 沿着响应者链往下传递
  • 如果链中某个响应者响应了事件或者已经没有响应者了,传递就会结束
  • 作用 :能清楚的看到每个响应者之间的联系,并且可以让一个事件多个对象处理
  • 响应者对象 : 能处理事件的对象
————>事件传递的完整过程
  • 1>现将事件对象由上往下传递( 由父控件传递给子控件 ) ,找到合适的控件来处理这个事件
  • 2>调用最合适控件的touches ..方法
  • 3>如果调用了[super touches ….] ,就会将事件顺着响应者链条往上传递 ,传递给上一个响应者
  • 4> 接着就会调用上一个响应者的touches..方法
————> 如何判断上一个响应者
  • 1> 如果当前这个view 是控制器的view ,那么控制器就是上一个响应者
  • 2>如果当前这个view 不是控制器的view ,那么父控件就是上一个响应者
—————>响应者链的事件传递过程
如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父视图
在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理
如果window对象也不处理,则其将事件或消息传递给UIApplication对象
如果UIApplication也不能处理该事件或消息,则将其丢弃

 

———>调整事件传递

  • 关闭事件的传递 : userInteractionEnabled 属性设置为NO  .此属性是UIView 的 ,所有子类都能设置.当视图Hidden 属性为YES 或者 alpha 为0时 ,视图也不接受事件
  • //将 移动停止的方法 (也就是触摸事件失效)
            self.userInteractionEnabled = NO;
  • 在一定时间内关闭事件传递: 应用程序调用 UIApplication 的 beginIgnoringInteractionEvents 和 endIgnoringInteractionEvents ;  Ignoring——>忽视 ,忽略   interaction [ɪntər'ækʃ(ə)n] 互动
  • UIView 不接收触摸事件的三种情况
  • 1> 不接受用户交互  :  userInteractionEnabled =NO;
  • 2>隐藏 hidden = YES ;
  • 3>3> 透明 : alpha = 0.0~0.01 ;
  • 提示:UIImageView的userInteractionEnabled默认就是NO,因此UIImageView以及它的子控件默认是不能接收触摸事件的
——> 多指触摸时需要打开 aView.multipleTouchEnabled = YES ;

 

———.>   检测触碰视图

  • 硬件检测到触摸操作 ,会将信息 交给UIApplication,开始检测
  • UIApplication ->window -> viewController -> view ->检测所有子视图
  • 最终确认触碰位置,完成响应者链的查询过程
————> 处理触摸事件 
  • 检测到响应者后 ,实现touchesBegan : withEvent : 等方法,即处理事件
  • 如果响应者没有处理事件,事件会向下传递,如果没有响应者处理,则丢弃触摸事件
  • 事件处理的顺序呢与触摸检测的顺序相反
  • 触摸的子视图 ->view ->viewController ->window ->UIApplication
 
 

三>   手势 识别

 

typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
    // 没有触摸事件发生,所有手势识别的默认状态
    UIGestureRecognizerStatePossible,
    // 一个手势已经开始但尚未改变或者完成时
    UIGestureRecognizerStateBegan,
    // 手势状态改变
    UIGestureRecognizerStateChanged,
    // 手势完成
    UIGestureRecognizerStateEnded,
    // 手势取消,恢复至Possible状态
    UIGestureRecognizerStateCancelled, 
    // 手势失败,恢复至Possible状态
    UIGestureRecognizerStateFailed,
    // 识别到手势识别
    UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded

};
 
 
 
 
 
——> 切换 两个view视图的代码
//按钮的响应事件
-(void)blueAction:(UIButton *)sender
{
    NSLog(@"绿色按钮点击了一下");
    if( [_BVC.view  superview] ==nil)
    {
        [_GVC.view removeFromSuperview];
        [self.view addSubview:_BVC.view];
       
        [self.view sendSubviewToBack:_BVC.view];
   
   
   
    }

}
 
——>视图控制器的切换 工程
 
 
二> 试图控制器 的触摸实现
 

UI 事件处理的更多相关文章

  1. [3D跑酷] UI事件处理系统

    在我们的Unity游戏项目中,GUI的表现采用NGUI.记录一下我们的处理方式: 需要解决的问题 1.需要处理大量按钮的点击事件 2.需要处理界面跳转事件 3.需要处理界面元素更新事件 解决方案 GU ...

  2. Runtime应用防止按钮连续点击 (转)

    好久之前就看到过使用Runtime解决按钮的连续点击的问题,一直觉得没啥好记录的.刚好今天旁边同时碰到这个问题,看他们好捉急而且好像很难处理,于是我先自己看看… 前面自己也学习了很多Runtime的东 ...

  3. C# 5.0 异步编程

    在C#5.0中,增加了一个强大的新功能--异步编程.( .NET FrameWork4.5  版本) 它以两个新型关键字出现: ·async ·await 1.Async方法有三种返回类型: asyn ...

  4. React Native at first sight

    what is React Native? 跟据官方的描述, React Native是一套使用 React 构建 Native app 的编程框架. 推出不久便引发了广泛关注, 这也得益于 Java ...

  5. 异步编程系列第04章 编写Async方法

    p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...

  6. 第12章 纤程(Fiber)

    12.1 纤程对象的介绍 (1)纤程与线程的比较 比较 线程(Thread) 纤程(Fiber) 实现方式 是个内核对象 在用户模式中实现的一种轻量级的线程,是比线程更小的调度单位. 调度方式 由Mi ...

  7. Android最佳实践指南

    Updated on 2016/1/6 修正了一些翻译段落欢迎转载,但请保留译者链接:http://www.jianshu.com/p/613d28a3c8a0 Lessons learned fro ...

  8. Android事件监听器Event Listener

    在 Android 中,我们可以通过事件处理使UI与用户互动(UI Events). UI的用户事件处理,即View处理用户的操作,在应用程序中几乎不可避免.View是重要的类,它是与用户互动的前线: ...

  9. Android 中的接口回调

    http://blog.csdn.net/wangjinyu501/article/details/22052187   在Android中到处可见接口回调机制,尤其是UI事件处理方面.举一个最常见的 ...

随机推荐

  1. Vue.js自定义指令的用法与实例

    市面上大多数关于Vue.js自定义指令的文章都在讲语法,很少讲实际的应用场景和用例,以致于即便明白了怎么写,也不知道怎么用.本文不讲语法,就讲自定义指令的用法. 自定义指令是用来操作DOM的.尽管Vu ...

  2. node源码详解(五) —— 在main函数之前 —— js和C++的边界,process.binding

    本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource5 本博客同步在https://cnodejs.o ...

  3. 字体图标 轻量级 Font Awesome

    今天呢,来推荐一款请轻量级 字体图标框架.Font Awesome 用法与bootstrap相似 打开网址.download下载,然后打开取到这两个,下载点这里,这个博客弄的挺好的. 找到exampl ...

  4. 性能监控之Java程序执行解析

    大家好,最近接触javassist技术,研究过程中对Java程序执行过程进行了一系列探索,弄清楚了几个盲区(仅针对个人而言),现将经验与大家分享. 1.编码->.java 通常指写代码的过程,最 ...

  5. ArcGIS API for JavaScript 4.2学习笔记[1] 显示地图

    ArcGIS API for JavaScript 4.2直接从官网的Sample中学习,API Reference也是从官网翻译理解过来,鉴于网上截稿前还没有人发布过4.2的学习笔记,我就试试吧. ...

  6. Iris的R语言命令工具箱(1)

    Iris的R语言命令工具箱(1) 最近在做数据分析,使用了R语言做了些数据处理和可视化,在此记下遇到过的问题.应用过的命令.处理方式以及工具包- *版权声明:本文为博主原创文章,转载请注明本文地址.h ...

  7. 【翻译】理解Joomla!模板

    最近在摸索Joomla的模板开发,看文档的时候心血来潮就干脆把这篇翻译过来,第一次翻译技术文档,肯定有很多错误,希望大家多多批评指正. 原文地址:https://docs.joomla.org/Und ...

  8. mybatis入门-框架原理

    mybatis是什么 在说mybatis原理之前,我们有必要知道,mybatis到底是个什么东西.mybatis是一个持久层的框架.是一个不完全的ORM框架.因为它需要由程序员自己去写sql语句.但是 ...

  9. 做一个项目前搭建一个tabBar(一)框架

    前言 通常做一个项目前,不算开始讨论需求,分析产品等等,一开始会给我们搭建一个框架,今天简单说一下搭建框架. github网址:https://github.com/Moonths/iWatch.gi ...

  10. java socket tcp(服务器循环检测)

    刚才看了下以前写了的代码,tcp通信,发现太简单了,直接又摘抄了一个,运行 博客:http://blog.csdn.net/zhy_cheng/article/details/7819659 优点是服 ...