在IOS开发中会遇到各种操作事件,通过程序可以对这些事件做出响应。
首先,当发生事件响应时,必须知道由谁来响应事件。在IOS中,由响应者链来对事件进行响应,所有事件响应的类都是UIResponder的子类,响应者链是一个由不同对象组成的层次结构,其中的每个对象将依次获得响应事件消息的机会。当发生事件时,事件首先被发送给第一响应者,第一响应者往往是事件发生的视图,也就是用户触摸屏幕的地方。事件将沿着响应者链一直向下传递,直到被接受并做出处理
路线图如 First Responser——>The Window——>The Application——>App Delegate
正常的响应者链流程经常被委托(delegation)打断,一个对象(通常是视图)可能将响应工作委托给另一个对象来完成(通常是视图控制器ViewController),这就是为什么做事件响应时在ViewController中必须实现相应协议来实现事件委托。
1.触摸和事件
——UITouch
UITouch对象是一个手指接触到屏幕并在屏幕上移动或离开屏幕时创建的。它有几个属性和实例方法:
phase:属性,返回一个阶段常量,指出触摸开始、继续、结束或被取消,分别对应UITouchPhaseBegan、UITouchPhaseMoved等
tapCount:属性,轻按屏幕的次数
timeStamp:属性,触摸发生的时间
view:属性,触摸始于那个视图
window:属性,触摸始于哪个窗口
lacationInView:方法,触摸在指定视图中的当前位置
previousLocationView:方法,触摸在指定视图中的前一个位置
——UIEvent
UIEvent对象包含一组相关的UITouch对象,由UITouch对象组成UIEvent对象,可以理解成一个完整的触摸操作是一个UIEvent,而这一系列完整操作中的每个点就是UITouch(按下、移动、离开)。
UIEvent的作用是提供相关触摸操作的列表,如果要获取在屏幕上触摸的手势,可以使用该对象,这一些列操作都存储在Foundation框架中的NSSet对象中。
——UIResponder
UIResponser提供四个事件响应的方法,这些方法是事件捕捉的核心。这些方法都接收两个参数,一个是NSSet(包含指定阶段的触摸)和一个UIEvent。
touchesBegan:withEvent: 在手指触摸屏幕时报告UITouchPhaseBegan事件
touchesMoved:withEvent: 在手指在屏幕上移动时报告UITouchPhaseMoved事件
touchesEnded:withEvent: 在手指离开屏幕时报告UITouchPhaseEnded事件
touchesCancelled:withEvent: 在因接听电话或其他因素导致取消触摸时报告UITouchPhaseCancelled事件
定义一个方法用来响应触摸事件:
-(void)manageTouches:(NSSet *)touches { for (UITouch *touch in touches) { switch (touch.phase) { caseUITouchPhaseBegan: NSLog(@"began..."); break; caseUITouchPhaseMoved: NSLog(@"move..."); break; caseUITouchPhaseEnded: NSLog(@"end..."); break; default: break; } } }
然后在ViewController中响应该方法:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
关于多点触摸,可以参考Apple IOS SDK开发文档,多点触摸在游戏及其一些新奇的应用中比较多,在常规的应用开发中还是比较少的用到多点触摸。
下次将介绍UIControl对象
加入我们的QQ群或微信公众账号请查看: Ryan's zone公众账号及QQ群
欢迎关注我的新浪微博和我交流:@唐韧_Ryan