iOS事件传递
不管iOS还是android,如果没有交互(可以响应用户操作),则不会吸引用户。万千世界中,则没有绝对静止的事物,只有相对静止的事物,也正是因为,事物处于动的状态中,一切才看起来那么美妙。
今天是复习,iOS响应者链。
何为响应者链,即iOS通过层级关系,把每个展示给用户的界面,进行管理起来,每个界面即是响应者链中的每个部分,有局部组成全局,则称之为链,那么响应者呢?又是什么意思?顾名思义,就是可以响应用户行为的或者可以动起来的组建。这些组件,直接或间接继承与uirespond,而UIrespond类本身里面定义了,四个处理用户行为的方法,正因为,响应者链中的组建,直接或间接继承UIrespond,所以才可以响应用户的操作。
用户点击,iOS屏幕,这个时候,iOS设备以及系统会把知道,用户要进行操作,从而把用户行为,封装为,iOS系统可以识别的事件,放到,iOS事件管理队列里面(iOS队列,具有fifo原则),然后呢,iOS就会找到当前活跃的application,接下来,事件分发队列就要把这些事件进行分发到当前活跃的application(即app)中。那iOS怎么通过事件分发队列分发给当前活跃的app呢?则是通过sendevent这个方法,来进行事件最初分发。
分发的顺序是,从最底部视图,向上分发,而分发的过程也是找寻最佳响应者的过程
UIapplication->UIwindow->so on...,在这个事件分发的过程中,系统会调用hit-test以及pointinside来进行响应者的寻找。在hit-test方法里面,调用pointinside方法,判断从iOS事件分发队列传过来的点是否在这个视图里面,如果在这个视图里面,并且这个视图处于可交互状态,则会进行一个递归的找寻该视图的子view的过程,重复调用pointinside 和 hit-test方法,直到找到最佳的视图,作为响应者来响应iOS事件分发队列传过来的,event。响应者响应event,是通过touchesbegin等方法来响应的。
注意:如果这个时候,该最佳响应者有UIgesutrere..,则会先让该手势响应该事件,如果该手势未响应该事件,则会在调用touchesbegin等方法。
找到了,最佳响应者,最佳响应者,要开始干活了,处理用户的操作行为,传递过程结束。但是这个时候,如果该最佳响应者并未响应该事件,那么这个事件又会沿着,响应者链重相反的方向进行传递,这个时候的顺序的就是:最佳响应者视图 传递该事件到 其父视图,父视图如果没有响应,则该视图,又会携带该事件传递到该视图的父视图里面
topestview->superview->superview-> so on
既然知道了,iOS响应用户行为的过程,是响应者链递归找寻最佳视图,传递point和event的过程,那么这个时候,就可以进行事件的拦截,想让哪个响应者响应该事件就让哪个响应者响应该事件
注意:必须处于同一个响应者链条
点击黄色视图,如果想让蓝色视图,或者橙色视图,响应该事件,则可以从写hit-test/pointinside方法
iOS中滚动视图的嵌套:
iOS滚动视图,里面包含了,uigesture子类,当用户点击或者滑动滚动视图的时候,UIgesture,是最先会进行事件的响应,比如:pan,pinch。
多个滚动视图,进行嵌套的时候,需要对手势处理得当,即让哪个滚动视图滚动,那就让哪个滚动视图滚动,即从写滚动视图,修改滚动视图的手势代理方法,同时也可以修改hit-test和pointinside方法,进行灵活多变的操作。
注:iOS响应事件通过touchesbegin,用户的滑动,点击,双击等等操作,都需要开发者,进行判断,处理起来较为复杂。因此苹果才推出UIgesture,来简便开发者对手势的处理,意思就是:拿来用就行,比如过,点击:tap手势来处理,不用在重新放到touchesbegin来进行判断
iOS响应链,构成了,iOS的一切,iOS的与用户的操作,正式因为有了,响应者链,app才会那么多姿多彩。里面的学问还有很多,更重要的就是明白原理,使用原理来解决不同的问题。
demo地址:https://github.com/YongLeiCHU/ScrollView-insert-TableView