IOS开发笔记 |
您所在的位置:网站首页 › uiresponder的子类 › IOS开发笔记 |
英文文档定义: The UIResponder class defines an interface for objects that respond to and handle events。 UIResponder为需要相应并处理事件的对象定义了一组接口。 IOS事件类型:触控事件、传感器事件和远程控制事件(UIResponser有相应所有的接口)。 IOS事件机制包含两个过程:查找事件,发送事件,响应并处理事件。在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发送事件)。 例子: 假设一个单击事件发生在了View D里面,系统首先会从最顶层的View A开始寻找,发现事件是在View A或者其子类里面,那么接着从B和C找,发现事件是在C或者其子类里面,那么接着到C里面找,这时发现事件是在D里面,并且D已经没有子类了,那么hit-test view就是View D。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
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |