最近做项目遇到子视图超过父视图部分点击事件无法响应!
以下三种方法点击事件无效:
关闭交互 隐藏空间 透明度低于0.01
//这三种情况点击事件无效
if(self.userInteractionEnabled == NO || self.hidden ==YES ||self.alpha <=0.01){
returnnil;
如上图所示: 超过绿色部分的红色btn点击事件失效 超过卡宴色上绿色view的tap手势失效
主要方法:
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
returnYES;
}
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
//这三种情况点击事件无效
if(self.userInteractionEnabled == NO || self.hidden ==YES ||self.alpha <=0.01){
returnnil;
}
CGPoint cyupPoint =[selfconvertPoint:pointtoView:self.cyUpView];
if ([self.upBtnpointInside:cyupPointwithEvent:event]) {
//如果在后面按钮上,可以返回按钮,让按钮响应事件
return self.cyUpView;
}
//判断点在不在后面的按钮身上
//首先要想判断在不在后面按钮范围内必须先把两个坐标放在同一坐标系下
//把当前的点转换到按钮身上的坐标系的点
CGPoint btnP = [selfconvertPoint:pointtoView:self.upBtn];
if ([self.upBtnpointInside:btnPwithEvent:event]) {
//如果在后面按钮上,可以返回按钮,让按钮响应事件
return self.upBtn;
}else{
//如果不在就按照系统默认做法
return [superhitTest:pointwithEvent:event];
}
}
比较好的相关博客:
一篇搞定事件传递、响应者链条、hitTest和po
http://www.jianshu.com/p/2f664e71c527
http://blog.csdn.net/cehae/article/details/52822345
demo:https://github.com/YST521/hitest.git (git小写)