oc响应者链原理分析

编程语言及工具

99人已加入

描述

  响应者链

  UIResponder作为一个响应者事件,所有的可交互控件都是UIResponder直接或者间接的子类。

  响应者链的起点为: 上面我们所寻找到的最最合适的View,而这个View将调用自身的touchesBegan:withEvent:方法来开始事件响应者链的起始传递。

  添加到屏幕中的视图层级关系,从最上层的可能是button的点击事件,传递给父类或者自身的控制器并调用父类的touchesBegan:withEvent:方法。一直到最底层显示的keyWindow上这就是响应者链的传递。响应者链是由多层视图组成的结构(不管是View,还是控制器都是继承于响应者类UIResponder的)。由最上面的子控件传递给最底层的window。

  如何判断上一个响应者

  如果当前这个view是控制器的view,那么控制器就是上一个响应者

  如果当前这个view不是控制器的view,那么父控件就是上一个响应者

  事件响应和响应者链的区别:

  事件响应是从最底层的keyWindow开始向上分发事件的,而响应者链是从最合适View开始向下传递的。 方向不同。

  C语言

  对于IOS设备用户来说,他们操作设备的方式主要有三种:触摸屏幕、晃动设备、通过遥控设施控制设备。对应的事件类型有以下三种:

  1、触屏事件(Touch Event)

  2、运动事件(Motion Event)

  3、远端控制事件(Remote-Control Event)

  为什么用队列管理事件,而不用栈?

  队列先进先出,能保证先产生的事件先处理。栈先进后出。

  响应者链条概念: iOS系统检测到手指触摸(Touch)操作时会将其打包成一个UIEvent对象,并放入当前活动Application的事件队列,单例的UIApplication会从事件队列中取出触摸事件并传递给单例的UIWindow来处理,UIWindow对象首先会使用hitTest:withEvent:方法寻找此次Touch操作初始点所在的视图(View),即需要将触摸事件传递给其处理的视图,这个过程称之为hit-test view。

  响应者对象(Responder Object) 指的是 有响应和处理事件能力的对象。 响应者链就是由一系列的响应者对象 构成的一个层次结构。

  UIResponder 是所有响应对象的基类,在UIResponder类中定义了处理上述各种事件的接口。我们熟悉的 UIApplication、 UIViewController、 UIWindow 和所有继承自UIView的UIKit类都直接或间接的继承自UIResponder,所以它们的实例都是可以构成响应者链的响应者对象。

  UIWindow实例对象会首先在它的内容视图上调用hitTest:withEvent:,此方法会在其视图层级结构中的每个视图上调用pointInside:withEvent:(该方法用来判断点击事件发生的位置是否处于当前视图范围内,以确定用户是不是点击了当前视图),如果pointInside:withEvent:返回YES,则继续逐级调用,直到找到touch操作发生的位置,这个视图也就是要找的hit-test view。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分