🔥谈谈事件的产生和传递和响应

Posted 1-434

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了🔥谈谈事件的产生和传递和响应相关的知识,希望对你有一定的参考价值。

谈谈事件的产生和传递和响应?
 
??事件的产生
我们知道UIApplication、UIViewController、UIView都是UIResponder的子类,都是可以处理事件的。在发生触摸事件的时候系统会先将该事件交给UIApplication处理,通常UIApplication先将事件交给UIWindow,然后window再在其视图层次依次向下寻找可以响应的视图。找到合适的视图后,就会调用视图控件的touches方法来作具体的事件处理。
??事件的传递
UIApplication->UIViewController->子视图...
如果父视图不能接收事件,那么就不会向下传递,既子视图也不可能接收处理事件。
寻找合适视图的过程
1.首先判断自己是否能接收触摸事件。(hitTest:withEvent: 不返回nil 。不能接收事件:1、userInteractionEnabled = NO 2、隐藏 3、透明度<0.01)。
2.判断触摸点是否在自己身上。(pointInside方法) 。
3.子控件数组倒序遍历,即从最上层往下遍历并,子控件重复前两个步骤。
4.如果没有符合条件的子控件,那么就认为自己最合适处理这个事件,也就是自己是最合适的view。(hitTest:withEvent: return self)
 
2.1、hitTest:withEvent:方法
 
  hitTest:withEvent:方法当事件传递到某个控件的时候,系统就会调用改控件的hitTest:withEvent:方法,返回合适的控件
  遍历子控件有就返回,没有就返回self,返回nil则表示需要父视图处理,其他子视图都不能处,hit:withEvent:方法底层会调用pointInside:withEvent:方法判断点在不在方法调用者的坐标系上,不在返回nil。
 
  我们可以通过重新控件的hitTest:withEvent:方法来改变处理事件的控件。想让谁处理就谁处理。
 
所以事件的传递过程: 产生触摸事件->UIApplication事件队列->[UIWindow hitTest:withEvent:]->返回更合适的view->[子控件 hitTest:withEvent:]->返回最合适的view
 
2.2、pointInside:withEvent:方法
 
  pointInside:withEvent:方法判断点在不在当前view上(方法调用者的坐标系上)如果返回YES,代表点在方法调用者的坐标系上;返回NO代表点不在方法调用者的坐标系上,那么方法调用者也就不能处理事件。
 
??事件响应
 
  我们事件传递找到合适的视图view的时候首先看view能否处理这个事件,如果能处理则交由其处理并停止该事件的向上响应(各种事件、滑动、touches...),如果不能则会将事件传递给其上级视图(view的superView);如果上级视图仍然无法处理则会继续往上传递;一直到 window,如果window还是不能处理此事件则继续交给application处理,如果最后application还是不能处理此事件则将其丢弃。
  如果实现某个touches..并在其中调用[super touches….];则父视图子视图可以同时响应。
??总结
 
  ios的事件传递是从下到上的(父视图-->子视图),有不能接收的(1、userInteractionEnabled = NO 2、隐藏 3、透明度<0.01)则停止向上传递,返回上一次的view去响应事件。事件响应是从上到下的(子视图-->父视图),有能响应的并没有进行相关处理的([super touches….])则停止向下响应。
 


T

以上是关于🔥谈谈事件的产生和传递和响应的主要内容,如果未能解决你的问题,请参考以下文章

谈谈-View的事件分发机制

谈谈我对Promise的理解

谈谈 Vue toRef 和 reactive

熟悉事件循环?那谈谈为什么会分为宏任务和微任务。

前端面试--JS=> 谈谈事件冒泡事件捕获和事件委托

谈谈 Vue shallowRef 和 shallowReactive