1、问题:
在一个UIScrollView上存在子View,该子View完全填充其父View(UIScrollView),此时,我需要一个触摸或者点击的事件,将子View移除,刚入坑IOS的我,绕了一大圈。
2、解决办法
刚开始,直接在子View上加上了三个UIGestureRecognizer,分别对应点击事件,上划和下划,测试的时候,点击事件的响应没有问题,但是上下划,全被父视图(UIScrollView)拿走了,经过一番资料查找和测试,发现了两种解决方法,如下:
a.比较简单的处理(后知后觉发现的)
在UIView中有一个方法,如下
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if (self.exceptView) {
if ([self.exceptView pointInside:[gestureRecognizer locationInView:self.exceptView] withEvent:nil]) {
return NO;
}
}
return YES;
}
这个方法就是通过返回值来判断当前手势识别是成功还是失败,所以,在父View中重写这个方法,当发生触摸的点是在子View中的时候,返回NO,此时,父View不会响应手势事件,所以事件自然而然走到了子View,子View便可以直接响应;
b.这个是我开始使用的比较复杂一点的方法
在UIScrollView中,有这么一个属性:canCancelContentTouches,默认值应该是false,他的意思是当前的ScrollView是否可以取消Touch事件,在参考了诸多博文中,将此变量的值设为YES,然后重写另一个方法:
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
return YES;
}
此方法也是UIView中的方法,默认返回YES,如果返回NO的话,也不会响应触摸事件,所以根据子View 的可见与否或者其他条件,返回NO,此时,事件也会传到子View 中,但是这个时候,子View不是通过添加手势来响应,而是需要重写Touch系列的方法:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self closeGuide];
}
没有复杂的逻辑的话,重写这一个就够用(我的场景一个就够用了)。如果不重写上面那个函数,其实事件也可以传递过来,但是父View和子View的TouchesBegan都会被调用,原因我还不是很清楚,希望有大神看到,劳烦指导一下。
在实现逻辑之后,当然还需要将父View的状态恢复,不影响其原本逻辑;
其实实现的方式太多,只是本人比较轴,希望趁着这个时候了解一下OC的事件传递,所以才非要在事件的处理过程中来做。
记录此坑,虽然是自坑;
下面贴上一个链接,介绍ios的事件传递,以做参考和学习:
希望与大家共勉