UI事件传递&响应

2019-12-16  本文已影响0人  暴躁的小豆子

说UI事件之前我们先看一下UIView&CALayer

关系

联系

UIView 中属性lyaer其实就是CALayer类型的,backgroundColor是对CALayer同名属性的包装,UIView的显示部分是由CALayer的contents来决定的,它对应backing store(其实是bitmap类型的位图),最终我们显示到屏幕上的UI空间可以理解成位图

区别

UIView 为CALayer提供显示的内容,以及负责处理触摸等事件,参与视图的事件响应链
CALayer 负责显示内容contents
\color{red}{这里体现了设计原则中的单一设计原则(一个类只负责一件事)}

事件传递&事件响应链

b1

例如 上图(b1) 试图点击视图c2,系统如何找到事件响应的视图,事件传递离不开两个方法

//响应试图的view
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
//判断点击位置是否在当前试图内,在就返回yes
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
事件传递流程
流程图

从流程图中可以看到,UIWindow会调用hitTest方法,系统hitTest方法中会去调用pointInside方法来判断点击是否在当前试图中,如果返回YES遍历当前试图,这里是从后往前遍历(即倒序遍历)他的子试图,子试图会去调用hitTest方法(如果子试图还有子试图,会去遍孙子视图,孙子视图会去hitTest方法)找到响应试图并结束流程,如果都没有找到返回当前视图Window

hitTest:withEvent:内部实现

按钮区域点击响应实例

上一篇 下一篇

猜你喜欢

热点阅读