英文文档定义:
The UIResponder
class defines an interface for objects that respond to and handle events。
UIResponder为需要相应并处理事件的对象定义了一组接口。
在UIKit框架中,UIApplication,UIView,UIController以及它们的子类直接或间接继承UIResponder,都具有事件响应能力。
过程:
1:用户触摸事件产生事件后,UIKit框架创建一个UIEvent,UIApplication从事件队列取出事件,查找事件产生事件的View。
2:hit-test view(查找产生事件的View):从底层的view往上找出触摸事件发生的view。
UIView中定义确定响应事件的两个接口:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event; //判断点是否在该区域内。
事件查找过程:(当前View遍历子View调用hitTest,直到点击的点在View中而且该View没有SubView,即为产生事件的View。UIApplication即向View发送事件)。
3:UIApplication直接发送事件到产生事件的View。View根据响应链处理事件。
4:响应链(顶层view通过nextResponder指向底层view):View中的addSubView方法,会将被add的View的nextResponder指向superView。类似C语言的链表,由此创建成完整的响应链。
View发送事件接口:sendAction:to from:forEvent: 自定义View时可通过该接口向响应链的下一个UIResponder发送事件。
5:若响应链中无找到响应者,UIApplication将抛弃事件。
UIResponder核心接口:
管理响应链:
获取nextResponder:- (UIResponder *)nextResponder (自定义子类必须设置nextResponder)
判断是否是第一响应者:- (BOOL)isFirstResponder
变为第一响应者:- (BOOL)becomeFirstResponder
判断能否成为FirstResponder:- (BOOL)becomeFirstResponder
与上方对应的两个方法:
- (BOOL)resignFirstResponder
- (BOOL)canResignFirstResponder
产生事件接口(可以自定义该事件重写判断产生了什么操作,一般不操作这些接口,产生的事件由简便的UIControl或者UIGestureRecognizer处理):
当一个或多个手指触摸到一个视图或窗口 :
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
当与事件相关的一个或多个手指在视图或窗口上移动时 :
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
当一个或多个手指从视图或窗口上抬起时 :
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
当一个系统事件取消一个触摸事件时 :
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event(突然来电话之类的,类似中断)
这四个方法默认都是什么都不做。UIKit中UIResponder的子类,尤其是UIView,这几个方法的实现都会把消息传递到响应链上。因此,为了不阻断响应链,我们的子类在重写时需要调用父类的相应方法;而不要将消息直接发送给下一响应者。
注意:默认情况下,多点触摸是被禁用的。为了接受多点触摸事件,我们需要设置响应视图的multipleTouchEnabled属性为YES。
传感事件:
iOS 3.0 + 开始支持motion事件,特别是摇动设备
移动事件开始 :
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
移动事件结束 :
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
取消移动事件 :
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event
与触摸事件不同的是,运动事件只有开始与结束操作;它不会报告类似于晃动这样的事件。这几个方法的默认操作也是什么都不做。UIKit中UIResponder的子类,尤其是UIView,这几个方法的实现都会把消息传递到响应链上。
远程事件:
iOS 4.0 + 开始支持远程事件,耳机
– remoteControlReceivedWithEvent:
注意:为了允许分发远程控制事件,UIApplication必须调用的beginReceivingRemoteControlEvents方法;若要关闭远程控制事件的分发,则调用endReceivingRemoteControlEvents方法。
UIEventType:
typedef enum {
UIEventTypeTouches,
UIEventTypeMotion,
UIEventTypeRemoteControl,
} UIEventType;
管理输入视图:
所谓的输入视图,是指当对象为第一响应者时,显示另外一个视图用来处理当前对象的信息输入。入UITextField、UITextView等在成为FirstResponder时,会显示系统键盘来输入信息。系统键盘即输入视图。
类型:inputView、inputAccessoryView,两者关系:
InputView:
@property(nonatomic, readonly, retain) UIView *inputView
@property(nonatomic, readonly, retain) UIInputViewController *inputViewController
若有些输入框有输入限制,比如只能数字,可在子类中重新定义读写属性来达到效果。
InputAccessoryView:
@property(nonatomic, readonly, retain) UIView *inputAccessoryView
@property(nonatomic, readonly, retain) UIInputViewController *inputAccessoryViewController
重新加载输入视图:- (void)reloadInputViews