「这是我参加2022初次更文应战的第30天,活动详情查看:2022初次更文应战」。
前言
IOS 中的工作可分为:
- 触摸工作(multitouch events)
- 加快计工作( accelerometer events)
- 长途控制工作(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:
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 常见特点
- 工作类型
@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逆向公号号主
简历模板、技术合作。注重我,都给你。