事件的传递与响应

 

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

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

如何判断上一个响应者?

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

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

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

  • 若是view 的控制器存在,就传递给控制器;对象

  • 若是控制器不存在,则将其传递给它的父视图blog

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

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

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

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

由于系统默认作法是把事件上抛给父控件,因此能够经过重写本身的touches方法和父控件的touches方法来达到一个事件多个对象处理的目的。event

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

 

总结

  • 若是父控件不能接收触摸事件,则子控件也没法接收触摸事件class

  • 若是想让控件不处理触摸事件,能够设置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方法重复上面的操做返回子控件的最合适子控件

相关文章
相关标签/搜索