首页 > 代码库 > 响应者链的事件传递过程

响应者链的事件传递过程

响应者链的事件传递过程
一、hitText方法

1、hitText方法在一个事件传递给一个控件的时候,控件就会调用这个方法
2、hitText作用寻找到最合适的view
3、hitText方法
    
1)、判断窗口能不能处理事件如果不能,意味着窗口不是最合适的view,而且也不会去寻找比自己更合适的view,直接返回nil,通知UIApplication,没有最合适的view
    
2)、判断触摸点在不在窗口。
    
3)、遍历自己的子控件,寻找有没有比自己更合适的view。
    
4)、如果子控件不接收事件,意味着子控件没有找到最合适的view,然后返回nil,告诉窗口没有找到更合适的view,窗口就知道没有比自己更合适的view,就自己处理事件。

//找最合适的view
// point是白色View的坐标系上的点
- (
UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
   
// 1.判断自己能否接收事件
   
if(self.userInteractionEnabled==NO||self.hidden==YES||self.alpha<=0.01)returnnil;
   
   
// 2.判断点在不在当前控件上面
   
if(![selfpointInside:pointwithEvent:event])returnnil;
   
   
// 3.去找有没有比自己更合适的view
   
//从后往前遍历自己的子控件
   
intcount =self.subviews.count;
   
   
for(inti = count -1; i >=0; i--) {
       
//获取子控件
       
UIView*childView =self.subviews[i];
       
       
//转换坐标系
       
//把自己坐标系上的点转换成子控件做坐标系上的点
       
CGPointchildPoint = [selfconvertPoint:pointtoView:childView];
       
       
UIView*fitView = [childViewhitTest:childPointwithEvent:event];
       
//找到最合适的view
       
if(fitView) {
           
returnfitView;
        }
    }
   
//没有找到比自己更合适的view
   
returnself;
}


/**
 *  
判断点在不在方法调用者的坐标系上
 *  point:
是方法调用者的坐标系上的点
 */

- (
BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    
return NO;
}

注意:
1、touch的默认做法:自己不处理,交给上一个响应者。 
2、上一个响应者默认是父控件。

二、响应者链的事件传递过程:
1.如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父视图。
2.在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理
3.如果window对象也不处理,则其将事件或消息传递给UIApplication对象
4.如果UIApplication也不能处理该事件或消息,则将其丢弃。

响应者链的事件传递过程