iOS事件传递和响应

iOS三大事件类型

1、触摸
2、加速
3、远程控制

响应事件的条件

1、userInteractionEnabled == true
2、alpha>0.01
3、hidden = false

系统确认处理响应的方法

// 确认点击范围是否在该控件
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
// 返回控件 (自身 nil  以及subview...)
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event

涉及到的其他方法

//CGGeometry: CG几何  C函数 判断点是否在rect内
CGRectContainsPoint(CGRect rect, CGPoint point)
//点坐标转换
- (CGPoint)convertPoint:(CGPoint)point toView:(nullable UIView *)view;
- (CGPoint)convertPoint:(CGPoint)point fromView:(nullable UIView *)view;

打印传递链

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UIResponder  *next = self;
    NSMutableString *mString = @"".mutableCopy;
    [mString appendString:@"->"];
    while (next!=nil) {
        [mString appendString:NSStringFromClass([next class])];
        next = [next nextResponder];
        [mString appendString:@"->"];
    }
    NSLog(@"Responder:%@",mString);
}

结果

CView->BView->
UIView->ViewController->
UIDropShadowView->UITransitionView->UIWindow->UIWindowScene->
UIApplication->
AppDelegate->

传递和响应和检测顺序

传递顺序:port->应用->AppDelegate->...->CView
响应判断顺序:CView->...->AppDelegate
检测顺序:AppDelegate->..->CView
注意:
当前View-pointInside合格 就会进一步倒序检查它的subViews  
因为要从最上面的subView开始检查  
并且subView只有一个可以响应 
如果要想一个多个可以在处理事件中转发

你可能感兴趣的:(iOS事件传递和响应)