• 事件的传递与响应


    事件的传递和响应的区别?

    事件的传递是从上到下(父控件到子控件),事件的响应是从下到上(顺着响应者链条向上传递):子控件到父控件。

    如何判断上一个响应者?

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

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

    响应者链条的事件传递过程?

    • 如果view 的控制器存在,就传递给控制器;

    • 如果控制器不存在,则将其传递给它的父视图

    • 在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给 window 对象进行处理

    • 如果 window 对象也不处理,则其将事件或消息传递给 UIApplication 对象

    • 如果 UIApplication 也不能处理该事件或消息,则将其丢弃(销毁)

    如何做到一个事件多个对象处理?

    因为系统默认做法是把事件上抛给父控件,所以可以通过重写自己的touches方法和父控件的touches方法来达到一个事件多个对象处理的目的。

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
        // 1.自己先处理事件...
        NSLog(@"do somthing...");
        // 2.再调用系统的默认做法,再把事件交给上一个响应者处理
        [super touchesBegan:touches withEvent:event]; 
    }

    总结

    • 如果父控件不能接收触摸事件,则子控件也无法接收触摸事件

    • 如果想让控件不处理触摸事件,可以设置userInteractionEnabled = NO,结果是包括父控件在内的所有子控件都不能处理触摸事件(虽然设置透明度和hidden=YES也可以,但是那样就看不见了注意:如果父控件的透明度设置为0或者hidden=YES,那么子控件也是不可见的。)

    • 遍历一个控件的子控件的顺序是从上到下的(最后添加的view最先被遍历)。

    • 指定某一个子控件响应事件,只需要在父控件的hitTest中返回指定的子控件就可以。

    • 如果一个控件的isUserInteractionEnabled=false,想让它继续继续处理触摸事件,可以在它的父控件的hitTest方法中直接返回它。

    • hitTest查找第一响应者的时候,即便父控件是第一响应者,还是要调用子控件的hitTest方法,否则怎么知道是不是还有其他最合适的响应者

      1. 先调用父控件的point:inside:方法

      2. 调用最上面子控件的point:inside:方法

      3. 如果最上面子控件的point:inside:方法返回false,则对应的hitTest返回nil

      4. 如果最上面子控件的point:inside:方法返回true,则调用对应的hitTest方法重复上面的操作返回子控件的最合适子控件

  • 相关阅读:
    《Advanced Bash-scripting Guide》学习(十九):两个整数的最大公约数
    《Advanced Bash-scripting Guide》学习(十八):[[ ]]与[ ]的一些特殊情况
    《Advanced Bash-scripting Guide》学习(十七):用more来查看gzip文件
    《Advanced Bash-scripting Guide》学习(十六):一个显示输入类型的脚本
    《Advanced Bash-scripting Guide》学习(十五):测试坏的链接文件(broken link)
    《Advanced Bash-scripting Guide》学习(十四):HERE Document和cat <<EOF
    《Advanced Bash-scripting Guide》学习(十三):引用变量的两个例子
    NOIP2016 蚯蚓
    [SCOI2012]滑雪与时间胶囊
    NOIP2016 天天爱跑步 80分暴力
  • 原文地址:https://www.cnblogs.com/mustard22/p/11093084.html
Copyright © 2020-2023  润新知