美文网首页iOS
手势和响应链

手势和响应链

作者: 汤志强 | 来源:发表于2019-12-14 09:37 被阅读0次

    先说几条结论:

    1. 系统首先根据hit-test方法,找出最佳响应者,建立响应链。

    2. UIResponder 默认响应是会将事件传给nextResponder,如果有响应者处理了这个事件,那么就会阻断事件的继续传递。

    3.如果一个View被触摸, 先去从最佳响应者开始去遍历响应链,

    3.1 如果响应链上发现有手势可以响应:

    a 如果最佳响应者是UIControl本身和子类,

          a1 该手势不是在UIControl身上,

               则执行UIControl的sendTarget:withAction:方法,否则执行手势,且该手势独占触摸事件,并且调用touch:Cancel方法取消向响应链的传播。

          a2 该手势是在UIControl身上,则执行该手势。不执行sendTarget:withAction:方法。

    b 如果最佳响应者不是UIControl本身和子类,

            b1 执行手势,且该手势独占触摸事件,并且调用touch:Cancel方法取消向响应链的传播。

    3.2 如果响应链上发现没有手势可以响应:则执行touch相关的事情和sendTarget:withAction:等方法,一旦有相关的方法被执行,则不会去调用super touch等方法,取消事件向上传递。否则让下一个响应者进行处理。

    4. 其中UIControl和UIScrollView比较特殊。

    UIControl 默认能够响应事件,会阻断事件沿着响应链传递。

    UIScrollView 默认添加了pan 和 pinch手势,UItableViewCell能够响应点击是调用了touchBegin等方法中实现的。

    5.另外可以设置手势的相关属性,控制View是否执行touch:Cancel方法,保证2者都生效。

    6. 常见的例子,见下文的链接。

    以上结论,纯属个人总结,如有不正确之处欢迎指正。

    事件传递和响应链

    相关文章

      网友评论

        本文标题:手势和响应链

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