美文网首页
iOS响应链

iOS响应链

作者: 溜溜的小枫 | 来源:发表于2018-04-13 02:19 被阅读0次

概念:

1 iOS有四大事件:触摸事件,运动事件,远程控制事件,3Dtouch事件。

我们重点介绍触摸事件。触摸事件是用户触摸屏幕后由系统产生的事件。有两种实例对象组成UItouch和UIevent。(一个触摸事件,根据触摸的手指数决定产生的UItouch实例对象数目)

UIcontrol的子类(注意这是一个事件响应者),手势,触摸事件(这是一个事件)。他们三个的优先级依次降低。

事件响应者对象:继承于UIResponder的都是事件响应者。它有三个功能:接受,传递,处理事件。

响应事件的四个函数:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

这四个函数系统会自动调用。

重写了这四个方法的实例对象,就是能够响应事件的对象。如果没有重写,系统写法是将事件上抛给父视图,一直上抛给到uiapplication的delegate,如果delegate也不能处理,就将事件抛弃。

2 触摸事件详解

触摸事件产生后,系统将其放入一个由uiapplication管理的事件队列中。uiapplication从队列中拿出最头的一个事件,通常将其交给keywindow,然后keywindow根据hitTest和pointInside这两个函数,递归调用找到第一响应者(其组合策略是:keywindow先调用hitTest,在hitTest中调用pointInside判断触摸的位置是否在keywindow上。如果在则从keywindow的子视图数组中拿出子视图,挨个调用hitTest函数,如果不在则认为当前视图不在响应链中,返回空并且不在其子视图系统中查询。子视图的调用重复上一步骤)。

(PS:子视图数组中拿出子视图是按照数组的倒叙来的,从数组的最后一个视图开始调用hitTest。

(PS:对于兄弟视图,是根据其父视图的子视图数组,倒叙查找)

注意:uiviewcontroller也在响应链中,由于其没有hitTest函数,所以查找的时候控制器不参与,但在响应的时候,它是参与的。响应链找到控制器的view,如果view不能响应事件,则将事件传递给控制器,控制器根据能否响应事件决定是否将事件在响应链中传递。

PS:查询过程生成响应链,并把事件在响应链中传递。响应过程是沿着生成的响应链往回传递事件。

有三种情况会中断响应链的查询:

视图的hidden等于YES。

视图的alpha小于等于0.01。

视图的userInteractionEnabled为NO。

还有一种易混淆的情况如果点击事件是发生在视图外,但在其子视图内部,子视图也不能接收事件并成为第一响应者。这是因为在其父视图进行hitTest:withEvent:的过程中,就会将其忽略掉。

常见的事件控制:

1 事件拦截:使用hitTest函数实现

2事件转发:使用pointInside实现

3事件多发:在响应事件的函数中调用 super 方法。(由于其父类的方法是系统默认的方法,系统默认的方法是将事件上抛给响应链的父视图,所以就可以在响应链中的多个响应者中实现事件的响应)

3 手势

手势不是触摸事件,具体的手势是触摸事件的一种。

在响应链中,如果某个对象添加了手势,那么响应链的查询过程不会改变(响应链传递事件,但是不传递手势),在响应事件的时候分以下情况:

1手势在第一响应者上且第一响应者能响应手势,那么会先调用第一响应者的touchesBegan和touchesMoved函数,然后执行touchesEnded方法结束当前触摸事件,然后调用手势函数,最后调用touchesCancelled销毁触摸事件。

2 手势不在第一响应者上,那么第一响应者会先调用第一响应者的touchesBegan和touchesMoved函数,此时系统会在响应链上查询上一个相应对象,直到找到可以响应手势的对象,然后在该对象中执行touchesEnded方法结束当前触摸事件,然后调用手势函数,最后调用touchesCancelled销毁触摸事件。

4 UIcontrol

UIcontrol是UIview的子类,所以继承了UIcontrol的类的实例对象也是响应者对象。

UIcontrol有自己的事件,它的级别比手势还高。它的行为和上面的手势一样,只不过他的优先级比手势还高。

相关文章

  • iOS 响应链

    iOS开发 - 事件传递响应链iOS 响应者链,事件的传递事件传递之响应链Cocoa Touch事件处理流程--响...

  • iOS响应者链

    iOS响应者链

  • 二、事件传递链和响应者链

    iOS触摸事件详解iOS开发-事件传递响应链 响应者链 UIResponser包括了各种Touch message...

  • 响应链

    iOS事件响应链中Hit-Test View的应用从iOS的事件响应链看TableView为什么不响应touche...

  • tableView 与collectionView嵌套 coll

    这里就要说到 iOS 的响应链iOS 的所有点击方法 都是用响应链 传递到最底层的 所以可以截取响应链 让coll...

  • iOS中对于响应链的理解

    对于响应链的理解: 在IOS中,有响应者链对事件进行响应,所有的响应类都是UIResponder的子类,响应者链是...

  • 深入浅出iOS事件机制

    深入浅出iOS事件机制事件传递:响应链事件传递响应链

  • iOS响应者链

    参考好文 iOS开发-事件传递响应链,用运行时分析 iOS事件传递:响应者链[译] http://www.jian...

  • UIView 和 CALayer

    从iOS的响应链开始说起 最近在看iOS 的响应链 看到了这样的关系 因为UIView 继承自 UIRespond...

  • ios响应者链

    iOS 响应者链 字数418 阅读41 评论0 喜欢3 响应者链 响应者链是一个响应者的连接序列,事件或者动作消息...

网友评论

      本文标题:iOS响应链

      本文链接:https://www.haomeiwen.com/subject/mbyqkftx.html