美文网首页
两个UIScrollView嵌套,子控件touch事件不响应问题

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

作者: 字节码 | 来源:发表于2017-10-30 17:06 被阅读174次

    两个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事件不响应问题

          本文链接:https://www.haomeiwen.com/subject/mzcmpxtx.html