美文网首页
iOS 事件传递与响应者链

iOS 事件传递与响应者链

作者: c608 | 来源:发表于2018-08-21 10:20 被阅读8次

    响应者链

    参考链接

    响应者对象:继承自UIResponder的对象称之为响应者对象。UIApplication、UIWindow、UIViewController和所有继承UIView的UIKit类都直接或间接的继承自UIResponder。
    //UIResponder一般响应以下几种事件:触摸事件(touch handling)、点按事件(press handling)、加速事件和远程控制事件:
    触摸事件(touch handling)
    - (void)touchesBegan:(NSSet *)touches withEvent:(nullable UIEvent *)event;
    - (void)touchesMoved:(NSSet *)touches withEvent:(nullable UIEvent *)event;
    - (void)touchesEnded:(NSSet *)touches withEvent:(nullable UIEvent *)event;
    - (void)touchesCancelled:(NSSet *)touches withEvent:(nullable UIEvent *)event;
    - (void)touchesEstimatedPropertiesUpdated:(NSSet *)touches NS_AVAILABLE_IOS(9_1);
    点按事件(press handling) NS_AVAILABLE_IOS(9_0)
    - (void)pressesBegan:(NSSet *)presses withEvent:(nullable UIPressesEvent *)event NS_AVAILABLE_IOS(9_0);
    - (void)pressesChanged:(NSSet *)presses withEvent:(nullable UIPressesEvent *)event NS_AVAILABLE_IOS(9_0);
    - (void)pressesEnded:(NSSet *)presses withEvent:(nullable UIPressesEvent *)event NS_AVAILABLE_IOS(9_0);
    - (void)pressesCancelled:(NSSet *)presses withEvent:(nullable UIPressesEvent *)event NS_AVAILABLE_IOS(9_0);
    加速事件
    - (void)motionBegan:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event NS_AVAILABLE_IOS(3_0);
    - (void)motionEnded:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event NS_AVAILABLE_IOS(3_0);
    - (void)motionCancelled:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event NS_AVAILABLE_IOS(3_0);
    远程控制事件
    - (void)remoteControlReceivedWithEvent:(nullable UIEvent *)event NS_AVAILABLE_IOS(4_0);
    响应者链:由多个响应者组合起来的链条,就叫做响应者链。它表示了每个响应者之间的联系,并且可以使得一个事件可选择多个对象处理
    
    响应链是如何工作,正确找到应该响应该事件的响应者的

    总结一句话就是:当有touch事件来的时候,会从最下面的视图开始执行 hitTest:withEvent: ,如果符合成为响应者的条件,就会继续遍历它的 subviews 继续执行 hitTest:withEvent: ,直到找到最合适的view成为响应者。

    事件触发条件:
    符合响应者的条件包括
    touch事件的位置在响应者区域内
    响应者 hidden 属性不为 YES
    响应者 透明度 不是 0
    响应者 userInteractionEnabled 不为 NO
    遍历 subview 时,是从上往下顺序遍历的,即 view.subviews 的 lastObject 到 firstObject 的顺序,找到合适的响应者view,即停止遍历.(重点:在子view中遍历视图的原则,即先遍历最后add上去的控件)
    
    事件消息传递过程图

    相关文章

      网友评论

          本文标题:iOS 事件传递与响应者链

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