iOS 知识梳理(响应链)

一直在写代码,忙忙碌碌却碌碌无为,所以最近想稍微沉淀一下,补充一下自己的理论基础,先从最常用的响应链开始吧。。。

一、如何理解iOS的响应链?

第一要明确的是能够接受和处理事件的响应者都是UIResponder的实例,包括UIView,UIViewController,UIApplication等。UILayer不包括在其中。

第一响应者由UIKit指定,当然根绝事件类型有所变化

       Touch event

  • 第一响应者是触摸事件产生的view

  • Press event

    第一响应者是焦点响应者。

  • Shake-motion events,Remote-control events,Editing menu messages

    第一响应者是你或者UIKit指定的对象。

响应分两部分,第一,UIKit如何找到第一个响应者? 第二,响应链如何传递

找到第一响应者

UIKit使用基于视图的hit-testing来确定Touch事件在哪里产生。

UIView的hitTest:withEvent:方法在视图层级中执行,寻找最深的包含指定Touch的子视图,这个视图将成为Touch事件的第一响应者。

该方法会调用子视图poiotInside:withEvent:方法来确定哪个子视图来响应该touch

简单理解起来就是从最底层开始遍历自己的子视图能否响应,直到找到最深一层的视图,当然会有一些边界判断,如果不在边界内,其所有子视图都忽略了,如果view不能响应其子视图当然也就全忽略了。

UIView 在一下三种情况下是不能响应事件的 

  • hidden = YES

  • userInteractionEnabled = NO

  • alpha < 0.01

响应链传递

这是官方给的默认响应链,由UIKit默认实现,当然你也可以改变属性来改变响应链

nextResponder该属性修改可以改变响应链,改变以后下个响应者就是自己定义的了

有些已经又UIKit默认实现了

比如UIViewController的view 的下一个响应者就是controller,window的rootViewController 下一个响应者就是window,window的下一个响应者为UIApplication,application的下一个响应者是apdelegate。

猜你喜欢

转载自blog.csdn.net/evol_f/article/details/82748704