响应者对象:
- 响应者对象是一个能接收并处理时间的对象,UIResponser 是所有响应者对象的基类
- 该基类定义了一系列事件处理的相关方法,如触摸事件,button点击事件等
- UIApplication,UIView,UIViewController 都是继承自 UIResponser,所有这些类的实例都是响应者对象
- 如果 hit-test 视图不处理收到的事件消息,UIKit 则将事件转发到响应者链的下一个响应者,看其能否对该消息进行处理
触摸事件的处理:
UIView 是 UIResponser 的子类,可以覆盖下列4个方法处理不同的触摸事件
-
- (void)touchesBegan:(NSSet *)toucheswithEvent:(UIEvent *)event
一根或者多根手指开始触摸屏幕 -
-(void)touchesMoved:(NSSet *)toucheswithEvent:(UIEvent *)event
一根或者多根手指在屏幕上移动(随着手指的移动,会持续调用该方法) -
-(void)touchesEnded:(NSSet *)toucheswithEvent:(UIEvent *)event
一根或多根手指离开屏幕 -
-(void)touchesCancelled:(NSSet *)toucheswithEvent:(UIEvent *)event
在触摸操作结束前,某个系统事件(例如有电话打进来)打断了触摸过程
由此,,我想到,之前点击屏幕空白处隐藏键盘是通过将view的基类修改为UIControl,然后实现View的Touch Up Inside事件实现的,,同样原理,可以直接将隐藏键盘的代码写在touch事件里应该也可以同样实现键盘隐藏的效果。
触摸事件的处理
- 上述的4个方法都有个 UIEvent 的参数,通过 UIEvent 可以得到事件的类型和产生时间,以及当前处于活动状态的所有触摸操作,但是,通常会使用UITouch 对象而不是 UIEvent 对象来处理触摸事件
- 当用户触摸屏幕时,系统会创建一个 UITouch 实例,并将该对象和触摸屏幕的那根手指关联。UITouch 保存着手指在屏幕上得触摸位置,当手指移动时,系统会更新同一个UITouch 对象(而不是去创建另外的多个UITouch对象),使之能够一直保存该手指在屏幕上得当前位置,当手指离开屏幕时,系统会取消响应的UITouch对象
- UITouch 对象还会保存一些其他信息,比如,手指的前一个位置、手指按下屏幕的次数(tapCount,可以用来判断单击还是双击事件)
- touches参数返回的是一个NSSet * 对象,之所以是NSSet * 对象是因为多点触摸的需要(单点触摸就不需要返回一个集合对象了),默认是不支持多点触摸的,要把视图的multipleTouchEnable 属性设置为YES ,通过touches.count可以验证多点触摸。