iOS --点击事件分发机制
来源:互联网 发布:老贾清弓 淘宝 编辑:程序博客网 时间:2024/06/07 04:41
前言:
iOS点击事件大家都比较熟悉子控件先拦截执行了父控件不执行.子控件不执行给父控件..一直往上边找...可是大家可能理解的都不是特别充分.再跟Android开发讨论的过程中发现他们的响应链和我们不太一样.所以查了写资料.分析记录一下.如有不对.请多指正!
hit-TestView
你要点击触发一个事件是不是得先找到那个响应事件的view .那个View 即为:hit-TestView.那iOS自己是怎么找到这个View的?
1.从视图最底层window开始遍历view
2.每个view 是按照subview的逆序来遍历的
具体解释一下:
例如.window 上有个mainView.
mainView 上有两个View 添加顺序是 subView1 和subView2
subView1 上有一个UIButton btn
subView2 上有一个UILabel leb
如果点击btn找寻hit-TestView调用方法 顺序是:window hitTest方法 --> mainView hitTest方法 --> subView2 hitTest方法(nil) --> subView1 hitTest方法 --> btn hitTest方法 -->找到hit-TestView
具体对于每一个view的实现方法是:
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{ if(self.alpha <= 0.01 || self.userInteractionEnabled || self.hidden){ return nil;//判断自己的透明度.是否能响应以及是否是隐藏 } if(![self pointInside:point withEvent:event]){ return nil;//判断点是否在自己身上 } NSEnumerator *enumerator = [self.subviews recerseObjectErumerator]; for(UIView *subview in enumerator){//判断子View UIView *hitTestView = [subview hitTest:point withEvent:event];//进行父视图的操作 if(hitTestView){ return hitTestView; } } return self;}//这个方法说明了寻找hit-TextView的过程//即从window 一直往下寻找点击的View
说明:
ios 的事件传递就是寻找view的过程 先是产生了触摸事件然后UIAppliction 的事件队列 - > UIWindow 的hit 方法 -> 一级一级从上到下传递找到合适的View;
在一定合适的情况下我们可以重写父视图的hit方法来返回合适的view.
响应链
找到你点击的那个View 一般就开始响应了 但是如果这个view 可以选择处理和不处理..或者交给下一个响应者处理.
一般情况下 这个事件在这个第一响应者的响应之后不会再往下响应了.
也就是说正常情况下 first Responder 如果不处理事件 则将事件交给nextResponder直到有对应的响应者,或者直到传到APPDelegate去
通过上边的介绍得到结论:
知道nextResponder 就能够知道响应链 那view 的nextResponder 都是?
UIView.nextResponder --> view的直接管理者(ViewController 或者superView)UIViewController.nextResponder --> viewController.view.superViewUIWindow.nextResponder --> UIApplicationUIApplication.nextResponder --> AppDelegate//发现 nextResponder 的类型为 UIView UIViewController UIApplication -->都是UIResponder
UIResponder
只有继承他的对象才能处理响应 – >响应者对象
现在主要是说咱们最常用的那个触摸事件.其他的响应以后有机会在分享
UIResponder 对于触摸事件提供了四个方法其他的我也不多说.就说一个我们都见过的我也自己用过的那就是..等等等等:
-(void)touchesBegan:(NSSet<Touch*>*)touches withEvent:(UIEvent *)event{ [super touchesBegan:touches withEvent:event];}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;//在view上移动时调用- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;//手指离开触摸结束调用- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event//触摸被其他事情打断(电话)
- iOS --点击事件分发机制
- iOS事件分发机制
- Android点击事件分发机制
- View的点击事件分发机制
- Android-点击事件分发机制验证
- Android View 点击事件的分发机制
- android点击事件分发机制总结
- android屏幕点击事件的分发机制
- 解锁Android点击事件分发机制
- Android View事件分发机制--点击事件的传递规则
- 关于android中的事件分发机制,点击事件分发机制详解
- android View的点击事件分发机制的简单认知
- 【Android学习】View点击事件的分发机制(一)
- 【Android学习】View点击事件分发机制(二)
- Android6.0源码解读之View点击事件分发机制
- Android6.0源码解读之Activity点击事件分发机制
- Android6.0源码解读之ViewGroup点击事件分发机制
- Android事件分发机制源码剖析(1)——Activity对点击事件的分发过程
- 恢复 git reset --hard *删除的文件
- 使用Serv_U架设FTP服务器(图解)
- 剑指offer—数字在排序数组中出现的次数
- rxjava2代码实战5--distinct,filter,buffer
- 机器学习入门:线性回归及梯度下降
- iOS --点击事件分发机制
- 【笔记-C语言】 字符串
- pintos (5) --Advanced Scheduler
- Dataland CD Label Designer(光盘封面制作软件)官方注册版V7.1.754下载
- 1204: 鸡兔同笼
- ST表
- java多线程(1)_正确使用Condition实现等待通知
- Struts2常用标签
- 【机器学习】--神经网络(NN)