美文网首页
- (UIView *)hitTest:(CGPoint)poi

- (UIView *)hitTest:(CGPoint)poi

作者: Accepted_ | 来源:发表于2018-08-09 18:28 被阅读0次

    解决超出父视图范围的子视图响应点击/手势等事件时,使用到以下方法

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;

    代码及分析参考以下网址

    让超出父视图范围的子视图响应事件,在UIView范围外响应点击

    如果一个button有一部分超出父控件的范围了,这部分无法响应点击,如果想让它响应点击应该怎么做

    具体代码

    //重写该方法后可以让超出父视图范围的子视图响应事件

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

        UIView *view = [super hitTest:point withEvent:event];

        if (view == nil) {

            for (UIView *subView in self.subviews) {

                CGPoint tp = [subView convertPoint:point fromView:self];

                if (CGRectContainsPoint(subView.bounds, tp)) {

                    view = subView;

                }

            }

        }

        return view;

    }

    但是我在不响应点击的按钮的父视图中重写了该方法,发现点在父视图范围外根本就不走这个方法.

    层级是这样的.

    [self.view addSubView:containerView];

    [containerView addSubView:AView];   //AView上有超出AView范围的Button

    对于位置和大小,containerView和AView是完全重叠的(即两控件bounds相同)

    找了很久原因,发现是因为Button不仅仅超出了父视图(即AView)的范围,同时不在父视图的父视图(即containerView)的范围内,所以不走hitTest:withEvent:方法.

    解决办法:

    改了一下视图层级结构

    [self.view addSubView:containerView];

    [self.view addSubVIew:AView];  //AView上有超出AView范围的Button

    (这样的话想让两个View完全重叠就设置为相同的frame即可)

    这样containerView和AView的父视图都是控制器的view,再点击超出AView范围的Button,就会执行hitTest:withEvent:方法了.

    其他需要考虑的,也有可能是按钮的确很小,可以给按钮设置一个背景颜色,然后看看按钮响应事件的范围(layer/宽高)是否合理.

    相关文章

      网友评论

          本文标题:- (UIView *)hitTest:(CGPoint)poi

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