理解UITouch,UIEvent,UIGestureRecognizer以及UIResponder

理解UITouch,UIEvent,UIGestureRecognizer以及UIResponder

  • UITouch:一个触摸对象代表一根手指对屏幕的接触以及在屏幕上的移动。其生命周期从手指接触屏幕开始,到手指离开屏幕为止。
  • 手势:一个手势需要一根或多根手指完成,即一个手势包含一个或多个UITouch对象。
  • 触摸序列:用于描述手势发生时(多个)手指接触屏幕的过程。整个过程从构成手势的第一根手指接触屏幕开始,到手势进行完毕时的最后一个手指离开屏幕为止。
  • UIEvent:代表iOS系统同外界互动时所发生的事件。有三种:触摸事件,动作事件,远程控制事件。对于触摸事件,UIEvent中保存着同当前触摸序列相关的UITouch对象。
  • UIGestureRecognizer:用于识别特定手势。
  • UIResponder:可以响应事件,动作消息等。多个响应对象组成响应链,从而形成完整的事件/消息响应体系。

UITouch

  • UITouch是UIKit中处理用户触屏交互的底层对象。
  • 每个UITouch都对应一个当前接触屏幕的手指。
  • 如果手指移动,系统会不断更新UITouch的属性,例如previousLocationInView:locationInView:
  • 在手势发生的过程中(触摸序列中),UITouch对象会被创建,被销毁,还会改变状态。例如,两个手指先后接触屏幕,而后又先后离开屏幕,在这个过程中,UITouch对象的数量会呈现1 --> 2 --> 1

UIEvent

  • UIEvent用来代表触摸事件,可以将多个同时或近似时间发生的手指对屏幕的接触(UITouch)描述为一个整体,解读为一个特定的手势或动作。
  • UIEvent对象的生命周期也只维持在手势发生(触摸序列)期间,不要试图retain UIEventUITouch对象,如果需要记录它们的信息,应该复制这些信息。

UIGestureRecognizer

将其添加至视图,可以将触摸事件识别为特定的手势,如果识别成功,则调用关联的动作方法。在iOS中,一共有六种标准手势

  • 点击
  • 捏合
  • 拖拽
  • 滑动
  • 旋转
  • 长按

当然也可以自定义手势。

UIResponder

让视图/控制器直接处理触摸事件,通过判定比较UITouch对象的前后状态,直接实现逻辑功能,例如绘画,拖动屏幕控件等。

处理触摸事件的四个方法

不论是UIGestureRecognizer还是UIResponder,都利用这四个方法处理触摸事件。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; // 处理开始阶段的UITouch对象

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; // 处理移动阶段的UITouch对象

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; // 处理结束阶段的UITouch对象

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; // 处理取消阶段的UITouch对象

多点触摸

  • 涉及多个UITouch对象,需要比较它们前后的状态,可以使用CFDictionaryRef,将对象的地址作为键,状态(值)地址作为值,存入字典。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在iOS开发中经常会涉及到触摸事件。本想自己总结一下,但是遇到了这篇文章,感觉总结的已经很到位,特此转载。作者:L...
    WQ_UESTC阅读 11,296评论 4 26
  • -- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实...
    翘楚iOS9阅读 8,119评论 0 13
  • 好奇触摸事件是如何从屏幕转移到APP内的?困惑于Cell怎么突然不能点击了?纠结于如何实现这个奇葩响应需求?亦或是...
    Lotheve阅读 58,723评论 51 604
  • 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件。我们称之...
    JonesCxy阅读 4,005评论 0 0
  • iOS中的事件可以分为三大类: 1> 触摸事件 2> 加速计事件 3> 远程控制事件 响应者对象 在iOS中不是任...
    脑子勺掉了吧你阅读 5,238评论 1 0