IOS开发笔记

您所在的位置:网站首页 uiresponder的子类 IOS开发笔记

IOS开发笔记

2023-08-28 02:16| 来源: 网络整理| 查看: 265

英文文档定义:

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