iOS开发 - 事件传递响应链
iOS 响应者链,事件的传递
事件传递之响应链
Cocoa Touch事件处理流程--响应者链
iOS事件响应链中Hit-Test View的应用
hitTest:withEvent:方法将会忽略隐藏(hidden=YES)的视图,禁止用户操作(userInteractionEnabled=YES)的视图,以及alpha级别小于0.01(alpha<0.01)的视图。如果一个子视图的区域超过父视图的bound区域(父视图的clipsToBounds 属性为NO,这样超过父视图bound区域的子视图内容也会显示),那么正常情况下对子视图在父视图之外区域的触摸操作不会被识别,因为父视图的pointInside:withEvent:方法会返回NO,这样就不会继续向下遍历子视图了。当然,也可以重写pointInside:withEvent:方法来处理这种情况。
注意:
hidden=YES
userInteractionEnabled=NO (imageView默认)
alpha级别小于0.01(alpha<0.01)的视图
子视图区域超过父视图的部分,因为父视图的pointInside:withEvent:方法会返回NO,这样就不会遍历子视图了。
记录两个方法
- (CGPoint)convertPoint:(CGPoint)point toView:(nullable UIView *)view; [aView convertPoint:point toView:bView];
讲point在aView里的坐标值 转换为到bView下的坐标。
正确调用 : point是aView上的一个点,现在转换到bView的坐标系上。
类似:- (CGPoint)convertPoint:(CGPoint)point fromView:(nullable UIView *)view;
- (CGRect)convertRect:(CGRect)rect fromView:(nullable UIView *)view; [bView convertRect:self.frame fromView: aView];
对于rect也是一样.
rect的值原本是相对于在aView的视图里,现在转换到bView下。其实size没变,只有origin变了。
类似- (CGRect)convertRect:(CGRect)rect toView:(nullable UIView *)view;
stackoverflow上有人提了这个问题,感觉说的很详细。点这里