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<UITouch *> *)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只有一个可以响应
如果要想一个多个可以在处理事件中转发
网友评论