01.手势与加速计触摸事件识别_第1页
01.手势与加速计触摸事件识别_第2页
01.手势与加速计触摸事件识别_第3页
01.手势与加速计触摸事件识别_第4页
01.手势与加速计触摸事件识别_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、触摸事件与手势识别讲师:刘凡技术博客: iOS的输入事件UIKit可识别三种类型的输入事件:触摸事件运动事件远程控制事件iOS中许多事件对象都是UIEvent类的实例,UIEvent记录了事件所产生的时刻和事件类型UIEvent类对事件类型定义了enum常量:typedef NS_ENUM(NSInteger, UIEventType) UIEventTypeTouches, UIEventTypeMotion, UIEventTypeRemoteControl,;由UIEvent对象的type属性可以获取事件的类型iOS输入事件示意图响应者对象在iOS中不是任何对象都能处理事件,只有继承了U

2、IResponser的对象才能接收并处理事件。我们称之为“响应者对象”UIApplication,UIViewController,UIView都继承自UIResponser,因此它们都是响应者对象,都能够接收并处理事件触摸事件的处理UIView是UIResponder的子类,可以覆盖下列4个方法处理不同的触摸事件。1. 一根或者多根手指开始触摸屏幕- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event2.一根或者多根手指在屏幕上移动(随着手指的移动,会持续调用该方法)- (void)touchesMoved:(NSSe

3、t *)touches withEvent:(UIEvent *)event3.一根或者多根手指离开屏幕- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event4.触摸结束前,某个系统事件(例如电话呼入)会打断触摸过程- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event注意:所有UIKit控件均继承自UIView触摸事件的处理上述4个方法都有个UIEvent的参数,通过UIEvent可以得到事件的类型和产生时间,以及当前处于活动状态的所有触

4、摸操作。但是,通常会使用UITouch对象而不是UIEvent对象来处理触摸事件当用户触摸屏幕时,系统会创建一个UITouch实例,并将该对象和接触屏幕的那根手指关联。UITouch保存着手指在屏幕上触摸的位置。当手指移动时,系统会更新同一个UITouch对象,使之能够一直保存该手指在屏幕上的当前位置。当手指离开屏幕时,系统会取消相应的UITouch对象UITouch对象还会保存一些其他信息,比如,手指的前一个位置、手指按下屏幕的次数(tapCount, 可以用来判断单击和双击事件)提示:iPhone开发中,要避免使用双击事件UITouch类中包含五个属性window:触摸产生时所处的窗口。由

5、于窗口可能发生变化,当前所在的窗口不一定是最开始的窗口view:触摸产生时所处的视图。由于视图可能发生变化,当前视图也不一定时最初的视图tapCount:点按操作和鼠标的单击操作类似,tapCount表示短时间内点按屏幕的次数。因此可以根据tapCount判断单击、双击或更多的点按timestamp:时间戳记录了触摸事件产生或变化时的时间,单位是秒phase:触摸事件在屏幕上有一个周期,即触摸开始、触摸点移动、触摸结束,还有中途取消。通过phase可以查看当前触摸事件在一个周期中所处的状态。phase是UITouchPhase类型的,是一个枚举配型,包含:UITouchPhaseBegan(触

6、摸开始)UITouchPhaseMoved(接触点移动)UITouchPhaseStationary(接触点无移动)UITouchPhaseEnded(触摸结束)UITouchPhaseCancelled(触摸取消)UITouch类中包含两个成员函数:- (CGPoint)locationInView:(UIView *)view:返回一个CGPoint类型的值,表示触摸在view这个视图上的位置,这里返回的位置是针对view的坐标系的。调用时传入的view参数为空的话,返回的时触摸点在整个窗口的位置- (CGPoint)previousLocationInView:(UIView *)vie

7、w:该方法记录了前一个坐标值,函数返回也是一个CGPoint类型的值, 表示触摸在view这个视图上的位置,这里返回的位置是针对view的坐标系的。调用时传入的view参数为空的话,返回的时触摸点在整个窗口的位置触摸事件的处理当某个UIView发生触摸事件时,系统会将和事件相关的UITouch对象作为参数传入因为可以有多根手指同时触发同一个事件,所以传给视图的是一组UITouch对象,保存在NSSet中,例如:如果两根手指同时触摸某个视图,那么touchesBegan:withEvent:的第一个参数是包含两个UITouch实例的NSSet对象;如果这两根手指一前一后分开触摸同一个视图,那么视

8、图会收到两个独立的touchesBegan:withEvent:消息,并且每个NSSet对象中只包含一个UITouch对象因此,根据NSSet中UITouch的个数可以判断出是单点触摸还是多点触摸触摸事件的传递发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中UIApplication会从事件队列中取出最前面的事件并将其分发以便处理,通常,先发送事件给应用程序的主窗口主窗口会调用hitTest:withEvent:方法在视图继承树中找到一个最合适的子视图来处理触摸事件,该子视图即为hit-test视图如果hit-test视图不处理收到的事件消息,UIKit则将

9、事件转发到响应者链中的下一个响应者,看其是否能对该消息进行处理UIApplicationwindowViewControllerViewView2View1当用户点击屏幕时,会产生一个UITouch对象,传递给UIApplication然后由window负责查找最适合响应触摸事件的对象由window以递归的方式调用界面上所有视图的hitTest方法找到合适的视图之后,Touch方法由对应的视图去完成!上级视图不再接管。响应者链示意图UIResponder有一个nextResponder属性,通过该属性可以组成一个响应者链,事件或消息在其路径上进行传递如果UIResponder没有处理传给它的事

10、件,会将未处理的消息转发给自己的nextResponder事件最终被传递给UIApplication对象如果没有配置任何对象来处理事件,该事件被丢弃响应者链事件处理过程如果hit-test视图无法处理事件,则通过响应者链向上传递1.如果hit-test视图的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父视图2.如果视图或它的控制器无法处理收到的事件或消息,则将其传递给该视图的父视图3.每一个在视图继承树中的上层视图如果不能处理收到的事件或消息,则重复上面的步骤1,24.在视图继承树的最上层视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给窗口对象进行处理5. 如果窗

11、口对象也不能进行处理,则其将事件或消息传递给UIApplication对象6.如果UIApplication也不能处理该事件或消息,则将其丢弃UIView不接收处理事件的三种情况不接收用户交互:userInteractionEnabled = NO;隐藏:hidden = YES;透明:alpha = 00.01触摸事件小结按照响应者链顺序递归查找最先处理事件的UIView四个UITouch事件1. 一根或者多根手指开始触摸屏幕- (void)touchesBegan:withEvent:2.一根或者多根手指在屏幕上移动- (void)touchesMoved:withEvent:3.一根或者

12、多根手指离开屏幕- (void)touchesEnded:withEvent:4.触摸结束前,某些系统事件会打断触摸过程(void)touchesCancelled:withEvent:手势识别Gesture RecognizeriOS3.2版本之后,苹果推出了手势识别(Gesture Recognizer),其目的是为了:简化开发者的开发难度统一用户体验iOS目前支持的手势识别UITapGestureRecognizer(点按)UIPinchGestureRecognizer(捏合)UIPanGestureRecognizer(拖动)UISwipeGestureRecognizer(轻扫)U

13、IRotationGestureRecognizer(旋转)UILongPressGestureRecognizer(长按)目前游戏中的手势识别使用的不多手势识别的使用方法创建手势识别实例设置手势识别属性,例如手指数量,方向等将手势识别附加到指定的视图之上编写手势触发响应方法手势识别的状态typedef NS_ENUM(NSInteger, UIGestureRecognizerState) / 没有触摸事件发生,所有手势识别的默认状态 UIGestureRecognizerStatePossible, / 一个手势已经开始但尚未改变或者完成时 UIGestureRecognizerState

14、Began, / 手势状态改变 UIGestureRecognizerStateChanged, / 手势完成 UIGestureRecognizerStateEnded, / 手势取消,恢复至Possible状态 UIGestureRecognizerStateCancelled, / 手势失败,恢复至Possible状态 UIGestureRecognizerStateFailed, / 识别到手势识别 UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded;手势识别的属性state手势状态view手势发生视图常用方法locationInView 获得手势发生对应视图所在位置手势识别演练摇晃监听使用方法1. 新建摇晃监听视图ShakeListenerView,并且设置 eFirstResponder返回YES2. 在Storyboard中将ViewController的View的Class设置为:ShakeListenerView3. 在ViewController.m文件中增加:viewDidAppear和viewDidDisappear在视图出现和消失时成为/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论