UI 事件处理
- 事件概述 : 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) 触摸取消 ;
{
// 一个手指
UITouch *touch = [touches anyObject];
//------> 需要定义一个变量 ,局部变量是不行的
}
-(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;
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
{
- 手势 : 有规律的触摸
- UITouch 代表触摸在屏幕上的一根手指 .可以获取触摸时间和触摸位置
- 如何获取touch对象 ,touches 集合中包含了视图上的所有手势
事件分为三类: 触摸事件 ,晃动事件 ,远程控制事件
重点 :触摸事件,一个触摸事件包括一个或多个TUtouch 对象 (手指 ) iPhone最多支持11个点.
———>UIResponder : 响应者
- 是可以响应事件并且可以对其进行处理的对象
- UIResponder 是响应者的基类 ,UIApplication ,UIView 和 从UIView 派生出来的子类都是源自它
- 第一响应者是当前正在接受事件的响应者对象
- 表示触摸事件中的一个手指
- 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以及它的子控件默认是不能接收触摸事件的
———.> 检测触碰视图
- 硬件检测到触摸操作 ,会将信息 交给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
-(void)blueAction:(UIButton *)sender
{
NSLog(@"绿色按钮点击了一下");
if( [_BVC.view superview] ==nil)
{
[_GVC.view removeFromSuperview];
[self.view addSubview:_BVC.view];
[self.view sendSubviewToBack:_BVC.view];
}
UI 事件处理的更多相关文章
- [3D跑酷] UI事件处理系统
在我们的Unity游戏项目中,GUI的表现采用NGUI.记录一下我们的处理方式: 需要解决的问题 1.需要处理大量按钮的点击事件 2.需要处理界面跳转事件 3.需要处理界面元素更新事件 解决方案 GU ...
- Runtime应用防止按钮连续点击 (转)
好久之前就看到过使用Runtime解决按钮的连续点击的问题,一直觉得没啥好记录的.刚好今天旁边同时碰到这个问题,看他们好捉急而且好像很难处理,于是我先自己看看… 前面自己也学习了很多Runtime的东 ...
- C# 5.0 异步编程
在C#5.0中,增加了一个强大的新功能--异步编程.( .NET FrameWork4.5 版本) 它以两个新型关键字出现: ·async ·await 1.Async方法有三种返回类型: asyn ...
- React Native at first sight
what is React Native? 跟据官方的描述, React Native是一套使用 React 构建 Native app 的编程框架. 推出不久便引发了广泛关注, 这也得益于 Java ...
- 异步编程系列第04章 编写Async方法
p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...
- 第12章 纤程(Fiber)
12.1 纤程对象的介绍 (1)纤程与线程的比较 比较 线程(Thread) 纤程(Fiber) 实现方式 是个内核对象 在用户模式中实现的一种轻量级的线程,是比线程更小的调度单位. 调度方式 由Mi ...
- Android最佳实践指南
Updated on 2016/1/6 修正了一些翻译段落欢迎转载,但请保留译者链接:http://www.jianshu.com/p/613d28a3c8a0 Lessons learned fro ...
- Android事件监听器Event Listener
在 Android 中,我们可以通过事件处理使UI与用户互动(UI Events). UI的用户事件处理,即View处理用户的操作,在应用程序中几乎不可避免.View是重要的类,它是与用户互动的前线: ...
- Android 中的接口回调
http://blog.csdn.net/wangjinyu501/article/details/22052187 在Android中到处可见接口回调机制,尤其是UI事件处理方面.举一个最常见的 ...
随机推荐
- Clojure发音
Clojure的发音和单词closure是一样的.Clojure之父是这样解释Clojure名字来历的 “我想把这就几个元素包含在里面: C (C#), L (Lisp) and J (Java). ...
- jQuery实践-别踩白块儿网页版
▓▓▓▓▓▓ 大致介绍 终于结束了考试,放假回家了.这次的别踩白块儿网页版要比之前做的 jQuery实践-网页版2048小游戏 要简单一点,基本的思路都差不多. 预览:别踩白块网页版 这篇博客并不是详 ...
- 使用python制作ArcGIS插件(6)案例分析
利用ArcPy制作航空制图插件 By 李远祥 这是笔者两年多前写的一个面向航路图做的一个插件,基本上将航路图的制作进行流程化,制作成为可交互的插件,只要有航路和机场的信息,就可以直接生成一个航路图,每 ...
- 移动HTML5前端性能优化总结
概述 1. PC优化手段在Mobile侧同样适用 2. 在Mobile侧我们提出三秒种渲染完成首屏指标 3. 基于第二点,首屏加载3秒完成或使用Loading 4. 基于联通3G网络平均338KB/s ...
- .Net程序员学用Oracle系列(16):访问数据库(ODP.NET)
1..Net for Oracle 常见数据库驱动 1.1.微软提供的驱动 1.2.甲骨文提供的驱动 1.3.其它厂商提供的驱动 2.ODP.NET 常见问题分析 2.1.参数化问题 2.2.方法调用 ...
- Ubuntu纯字符界面的一些设置
由于Ubuntu的纯字符界面不支持中文显示,所以进行了一些配置,为了更好的显示 1. 把环境语言配置为英文 在用户目录下的".bashrc"文件的结尾处添加以下内容,然后重新登录 ...
- node-webkit制作桌面应用
心血来潮突然想用js尝试写桌面应用,突然发现我大js真的无所不能.在网上搜到了这么一个东东:node-webkit.用Node.js来进行系统资源的访问,用HTML+CSS完成页面的搭建.哇,一切突然 ...
- 关于C# XmlDocument方法Load加载流后自动释放流的解决方法
在实际应用doc.Load(Request.InputStream)的时候,doc.Load方法内置默认释放流 造成再次度Request.InputStream的时候,代码报错 替换方法: XmlDo ...
- githup教程
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/瘳雪峰-Git教程http://w ...
- 关注云端搜索技术:elasticsearch,nutch,hadoop,nosql,mongodb,hbase,cassandra 及Hadoop优化
http://www.searchtech.pro/ Hadoop添加或调整的参数: 一.hadoop-env.sh1.hadoop的heapsize的设置,默认1000 # The maximum ...