事件传递

来源:互联网 发布:wto关税数据库 编辑:程序博客网 时间:2024/05/27 14:14

事件传递

标签(空格分隔): 事件处理


不能响应事件的三种情况

  • 控件不能获得和界面的交互(UIImageView默认就不能获得和界面的交互)
  • 控件是隐藏状态
  • 控件的alpha(透明度)< 0.01

寻找事件的最佳响应者

事件传递示例图
模拟器截图

  • 点击蓝色View,会触发一次点击事件
  • 首先点击事件传递给UIApplication
  • UIApplication传递给UIWindow(UIWindow接收到事件那一刻执行hitTest方法寻找最优响应者)
    • UIWindow会判断两个问题是否满足
      • 是否能够获得交互
      • 触摸点是否在UIWindow控件范围内
    • 如果满足以上两个条件,UIWindow就会从最外层子控件开始遍历自己的子控件(当前截图中只有白色的UIView是UIWindow的子控件)
  • 白色(UIView)控件接收到事件就调用hitTest方法寻找最优子控件,同样判断两个问题
    • 是否能够获得交互
    • 触摸点是否在UIWindow控件范围内
    • 如果满足以上两个条件,UIView就会从最外层子控件开始遍历自己的子控件(紫色和绿色都是白色的子控件,但是紫色后添加,所以先传递给紫色(条用紫色控件的hitTest方法),如果紫色同样满足两个条件就继续遍历,最后可能轮到蓝色的时候依旧满足条件且蓝色没有子控件,那么蓝色就是最佳响应者,如果紫色不满足任何一个条件,那么就把时间传递给绿色来继续判断,如果绿色满足条件并且绿色已经没有子控件那么绿色控件就是最优的响应者,)

寻找最合适响应者的方法

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{    // 将触摸点转换成相对btn坐标原点的坐标,可通过转换后的坐标判断触摸点是否在btn上    CGPoint p = [self convertPoint:point toView:_btn];    NSLog(@"%@---%@",NSStringFromCGPoint(point),NSStringFromCGPoint(p));    // 如果当前触摸点在btn上就返回按钮,按钮作为最佳响应者    if ([_btn pointInside:p withEvent:event]) {        return _btn;    }    return [super hitTest:point withEvent:event];}
  • 此方法的返回值是最合适的View
  • 可通过修改此方法的返回值来修改最合适的View
  • 参数point是方法调用者坐标系上的触摸点的位置
  • 参数event是记录事件的类型(触摸事件,加速计事件,远程控制事件)
  • *
0 0
原创粉丝点击