两个UIScrollView嵌套,子控件touch事件不响应问题

两个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;
}

你可能感兴趣的:(两个UIScrollView嵌套,子控件touch事件不响应问题)