两个UIScrollView嵌套,子控件touch事件不响应问题:
描述: 一个发布图片和文本的编辑器,在控制器的view上添加scrollView(叫父scrollView),然后在父scrollView上添加一个View(叫PhotoView),这个PhotoView有一个子控件是scrollView(子scrollView),
此时scrollView之间产生嵌套关系,在子scrollView上添加Button用来添加图片的
问题:子scrollView的子控件不响应事件了
view之间的关系:(-> 代表箭头右边是箭头坐标的子控件,事件的分发也是由父控件去找合适的子控件)
父scrollView -> PhotoView -> 子scrollView
问题分析:
1.经过重写父scrollView的hitTest:withEvent:方法排查,发现内部返回的是他自己,
2.重写PhotoView的hitTest:withEvent:发现返回的是nil
3.重写子scrollView的hitTest:withEvent:发现其不被调用
经过排查发现事件传递到PhotoView时,找不到合适的响应hitTest的view了,所以返回了nil
解决方法:
重写PhotoView的hitTest:withEvent:方法
其过程是:如果hitTest方法返回nil,并且当前点在子scrollView上,就去遍历子scrollView的子控件,如果子控件是UIControl类型或VideoPlayImageView类型的,而且当前点在子控件上,就返回这个子控件成为最合适的响应事件的view
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *view = [super hitTest:point withEvent:event];
if (!view && [_scrollView pointInside:point withEvent:event]) {
view = _scrollView;
CGPoint currentPoint = point;
for (UIView *subview in view.subviews) {
BOOL res = [subview isKindOfClass:[UIControl class]] || [subview isKindOfClass:[VideoPlayImageView class]];
if (res) {
currentPoint = [self convertPoint:point toView:view];
res = [subview pointInside:currentPoint withEvent:event];
}
if (res) {
return subview;
}
}
}
return view;
}