UIView和CALayer

2020-12-06  本文已影响0人  CyberDunk1997

1. UIView和CALayer

结构图

UIView和CALayer的这种设计模式,体现了六大设计原则中的——单一职能原则。即一个类只负责一件事情。

2. 事件传递与传递链

1

问:点击View C2,系统是如何找到响应的视图View C2,事件是如何传递的?

2.1 事件传递用到的两个主要的方法

方法1:返回的是UIView,如果某个视图能响应事件,就返回这个视图
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;


方法2:返回的是BOOL值,判断某一个点击的位置(CGPoint),是否在当前视图内,如果是,返回YES
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

2.2 传递链,点击屏幕寻找第一响应者的流程

流程图

2.3 hitTest内部实现

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;

  1. 检查该视图是否被隐藏,是否可交互,透明值是否大于0.01,如果有一项满足,则返回 nil
  2. 利用方法- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event; 检查点击的点是否在当前视图内部,如果不在,则返回 nil
  3. 倒序遍历自己的子视图(后加入的子视图先遍历),每个子视图都调用一次- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;,如果某个子视图返回了一个UIView,则可以return这个view
  4. 如果所有子视图都返回nil,则把自己返回


    hitTest

3. 响应链

事件虽然通过传递链从上到下找到了第一响应者,但是第一响应者不一定能处理这个事件,事件最后由谁来处理,还需要通过一个从下往上的响应链来寻找

响应链

3.1 几个方法

- (void)touchesBegin:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

3.2 事件的传递

事件的传递
上一篇下一篇

猜你喜欢

热点阅读