当我们在手机屏幕上进行了一次点击,或者滑动,轻扫手机屏幕,接下来,我们的手机该如何回应我们的指令,软件又经历了哪些过程呢?这篇文章是我自己的简单理解,如有不当,请指出。
1、事件链
当我们用手指轻触屏幕,首先是app的UIApplication对象接收到了这次点击事件,紧接着,UIApplication对象把这次点击传递给了UIWindow对象,UIWindow对象继续向他的子View对象传递,直到传递到最上层。举个例子:
我理解的就是,app会把点击事件通过传给他上面的每一个子View,至于谁来响应,那就是响应链了。就像上图那样,点击了红色的View,传递过程是这样的:
UIApplication对象——>UIWindow对象——>rootVC.view对象——>redview对象,blueView对象。
2、响应链
当每一个view都收到点击事件之后,谁来做出响应呢?首先,能够响应这个点击的是谁呢?能够响应事件的View,userInteractionEnabled属性一定要是yes。
响应过程是和时间传递过程相反的。
最上面的红色view发现点击事件是在自己的范围内,且自己可以响应这个事件,那么他就不再向下传递了,这就可以理解两个按钮,如果都可以响应点击事件,那么正常情况下应该是上面的按钮响应点击事件。如果红色的View发现自己不具备响应这个事件的能力,那么他会把事件继续向下传递,传递到他的上一层也就是rootVC.view,就这样依次向下传递,直到UIwindow层,发现依然没有可以响应的View,那么这个点击事件就没有响应者,点击无效。
总结
view会调用hitTest:withEvent:方法,hitTest:withEvent:方法底层会调用pointInside:withEvent:方法判断触摸点是不是在这个view的坐标系上。如果在坐标系上,会分发事件给这个view的子view。然后每个字view重复以上步骤,直至最底层的一个合适的view。
事件响应会先从底层最合适的view开始,然后随着上一步找到的链一层一层响应事件。如需吞并事件只需重写touchesBegan: withEvent:方法,并不调用父类方法即可。