「这是我参加2022初次更文应战的第30天,活动详情查看:2022初次更文应战」。

前言

IOS 中的工作可分为:

  1. 触摸工作(multitouch events)
  2. 加快计工作( accelerometer events)
  3. 长途控制工作(remote control events)
    Event type First responder
    Touch events The view in which the touch occurred.
    Press events The object that has focus.
    Shake-motion events The object that you (or UIKit) designate.
    Remote-control events The object that you (or UIKit) designate.
    Editing menu messages The object that you (or UIKit) designate.

Responder Chain:

iOS 小技术: Responder Chain(呼应者链)【上篇】

I 呼应者方针

iOS中不是任何方针都能处理工作,只有继承了UIResponder的方针才干接收并处理工作,咱们称之为“呼应者方针”。

1.1 触摸工作

UIApplication、UIViewController、UIView都继承于UIResponder。

UIResponder内部供给了以下方法来处理工作

//一根或许多根手指开端触摸view,系统会自动调用view的下面方法
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
//一根或许多根手指在view上移动,系统会自动调用view的下面方法(随着手指的移动,会继续调用该方法)
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
//一根或许多根手指脱离view,系统会自动调用view的下面方法
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
//触摸完毕前,某个系统工作(例如电话呼入)会打断触摸进程,系统会自动调用view的下面方法[可选]
- (void)touchesCancelled:(nullable NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;

1.2 加快计工作

- (void)motionBegan:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event NS_AVAILABLE_IOS(3_0);
- (void)motionEnded:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event NS_AVAILABLE_IOS(3_0);
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event NS_AVAILABLE_IOS(3_0);

1.3 长途控制工作

- (void)remoteControlReceivedWithEvent:(nullable UIEvent *)event NS_AVAILABLE_IOS(4_0);

II UItouch

当用户用一根手指触摸屏幕时,会创立一个与手指相关联的UITouch方针;一根手指对应一个UItouch方针。

2.1 UITouch的效果

保存着跟手指相关的信息,比如触摸的方位、时刻、阶段。

1, 当手指移动时,系统会更新同一个UITouch方针,使之可以一贯保存该手指的触摸方位。 2. 当手指脱离屏幕时,系统会销毁相应的UITouch方针

提示:iPhone开发中,要防止运用双击工作!

2.2 UITouch的特点

////记录了触摸工作产生或变化时的时刻,单位是秒The relative time at which the acceleration event occurred. (read-only)
@property(nonatomic,readonly) NSTimeInterval      timestamp;
////其时触摸工作地点的状况
@property(nonatomic,readonly) UITouchPhase        phase;
//// touch down within a certain point within a certain amount of timen短时刻内点按屏幕的次数,可以依据tapCount判别单击、双击或更多的点击
@property(nonatomic,readonly) NSUInteger          tapCount;   
@property(nonatomic,readonly) UITouchType         type NS_AVAILABLE_IOS(9_0);
//触摸产生时地点的窗口
@property(nullable,nonatomic,readonly,strong) UIWindow                        *window;
//触摸产生时地点的视图
@property(nullable,nonatomic,readonly,strong) UIView                          *view;
//The gesture-recognizer objects currently attached to the view.
@property(nullable,nonatomic,readonly,copy)   NSArray <UIGestureRecognizer *> *gestureRecognizers

2.3 UITouch的方法

/*回来值表明触摸在view上的方位
这儿回来的方位是针对view的坐标系的(以view的左上角为原点(0, 0))
调用时传入的view参数为nil的话,回来的是触摸点在UIWindow的方位*/
- (CGPoint)locationInView:(nullable UIView *)view;
//该方法记录了前一个触摸点的方位
- (CGPoint)previousLocationInView:(nullable UIView *)view;

III UIEvent

每产生一个工作,就会产生一个UIEvent方针,UIEvent称为工作方针,记录工作产生的时刻和类型

3.1 常见特点

  1. 工作类型
@property(nonatomic,readonly) UIEventType     type NS_AVAILABLE_IOS(3_0);
@property(nonatomic,readonly) UIEventSubtype  subtype NS_AVAILABLE_IOS(3_0);

2, 工作产生的时刻

@property(nonatomic,readonly) NSTimeInterval  timestamp;

3.2 获取touch方针的方法

- (nullable NSSet <UITouch *> *)allTouches;
- (nullable NSSet <UITouch *> *)touchesForWindow:(UIWindow *)window;
- (nullable NSSet <UITouch *> *)touchesForView:(UIView *)view;
- (nullable NSSet <UITouch *> *)touchesForGestureRecognizer:(UIGestureRecognizer *)gesture NS_AVAILABLE_IOS(3_2);
// An array of auxiliary UITouch’s for the touch events that did not get delivered for a given main touch. This also includes an auxiliary version of the main touch itself.
- (nullable NSArray <UITouch *> *)coalescedTouchesForTouch:(UITouch *)touch NS_AVAILABLE_IOS(9_0);
// An array of auxiliary UITouch’s for touch events that are predicted to occur for a given main touch. These predictions may not exactly match the real behavior of the touch as it moves, so they should be interpreted as an estimate.
- (nullable NSArray <UITouch *> *)predictedTouchesForTouch:(UITouch *)touch NS_AVAILABLE_IOS(9_0);

IV 什么是呼应者链?

iOS中的呼应者链(Responder Chain)是用于承认工作呼应者的一种机制,其间的工作首要指触摸工作(Touch Event),该机制和UIKit中的UIResponder类严密相关。 呼应触摸工作的都是屏幕上的界面元素,并且有必要是继承自UIResponder类的界面类(包含各种常见的视图类及其视图控制器类,如UIView和UIViewController)才可以呼应触摸工作。

  • 一个工作呼应者的完成首要经过两个进程:hitTest方法射中视图和呼应者链承认呼应者。 hitTest方法首先从顶部UIApplication往下调用(从父类到子类),直到找到射中者,然后从射中者视图沿着呼应者链往上传递寻找真实的呼应者。

4.1.射中检验

射中检验(hitTest)首要会用到视图类的hitTest函数和pointInside函数。

其间,前者用于递归寻找射中者,后者则是检测其时视图是否被射中,即触摸点坐标是否在视图内部。

当触摸工作产生后,系统会将触摸工作以UIEvent的方法加入到UIApplication的工作队列中,UIApplication将工作分发给根部的UIWindow去处理,UIWindow则开端调用hitTest方法进行迭代射中检测。

  • 射中检测具体迭代的进程为:假设触摸点在其时视图内,那么递归对其时视图内部一切的子视图进行射中检测;假设不在其时视图内,那么回来NO中止迭代。这样最终会承认屏幕上最顶部的射中的视图元素,即射中者。

4.2.呼应者链

经过射中检验找到射中者后,使命并没有完成,由于最终的射中者不一定是工作的呼应者。 所谓的呼应就是开发中为工作绑定的一个触发函数,工作产生后实行呼应函数里的代码,例如经过addTarget方法为按钮的单击工作绑定呼应函数,在按钮被单击后能及时实行想要实行的使命。

see also

iOS 小技术:呼应者链的工作传递进程:https://kunnan.blog.csdn.net/article/details/74107917

联络作者: iOS逆向(公号:iosrev)


作者简介:CSDN 博客专家认证丨全站 Top 50、华为如此享专家认证、iOS逆向公号号主


简历模板、技术合作。注重我,都给你。